⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aic79xx_osm.h

📁 linux-2.6.15.6
💻 H
📖 第 1 页 / 共 2 页
字号:
ahd_inw_atomic(struct ahd_softc * ahd, long port){	uint8_t x;	if (ahd->tags[0] == BUS_SPACE_MEMIO) {		x = readw(ahd->bshs[0].maddr + port);	} else {		x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));	}	mb();	return (x);}static __inline voidahd_outb(struct ahd_softc * ahd, long port, uint8_t val){	if (ahd->tags[0] == BUS_SPACE_MEMIO) {		writeb(val, ahd->bshs[0].maddr + port);	} else {		outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));	}	mb();}static __inline voidahd_outw_atomic(struct ahd_softc * ahd, long port, uint16_t val){	if (ahd->tags[0] == BUS_SPACE_MEMIO) {		writew(val, ahd->bshs[0].maddr + port);	} else {		outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));	}	mb();}static __inline voidahd_outsb(struct ahd_softc * ahd, long port, uint8_t *array, int count){	int i;	/*	 * There is probably a more efficient way to do this on Linux	 * but we don't use this for anything speed critical and this	 * should work.	 */	for (i = 0; i < count; i++)		ahd_outb(ahd, port, *array++);}static __inline voidahd_insb(struct ahd_softc * ahd, long port, uint8_t *array, int count){	int i;	/*	 * There is probably a more efficient way to do this on Linux	 * but we don't use this for anything speed critical and this	 * should work.	 */	for (i = 0; i < count; i++)		*array++ = ahd_inb(ahd, port);}/**************************** Initialization **********************************/int		ahd_linux_register_host(struct ahd_softc *,					struct scsi_host_template *);uint64_t	ahd_linux_get_memsize(void);/*************************** Pretty Printing **********************************/struct info_str {	char *buffer;	int length;	off_t offset;	int pos;};void	ahd_format_transinfo(struct info_str *info,			     struct ahd_transinfo *tinfo);/******************************** Locking *************************************/static __inline voidahd_lockinit(struct ahd_softc *ahd){	spin_lock_init(&ahd->platform_data->spin_lock);}static __inline voidahd_lock(struct ahd_softc *ahd, unsigned long *flags){	spin_lock_irqsave(&ahd->platform_data->spin_lock, *flags);}static __inline voidahd_unlock(struct ahd_softc *ahd, unsigned long *flags){	spin_unlock_irqrestore(&ahd->platform_data->spin_lock, *flags);}/******************************* PCI Definitions ******************************//* * PCIM_xxx: mask to locate subfield in register * PCIR_xxx: config register offset * PCIC_xxx: device class * PCIS_xxx: device subclass * PCIP_xxx: device programming interface * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices) * PCID_xxx: device ID */#define PCIR_DEVVENDOR		0x00#define PCIR_VENDOR		0x00#define PCIR_DEVICE		0x02#define PCIR_COMMAND		0x04#define PCIM_CMD_PORTEN		0x0001#define PCIM_CMD_MEMEN		0x0002#define PCIM_CMD_BUSMASTEREN	0x0004#define PCIM_CMD_MWRICEN	0x0010#define PCIM_CMD_PERRESPEN	0x0040#define	PCIM_CMD_SERRESPEN	0x0100#define PCIR_STATUS		0x06#define PCIR_REVID		0x08#define PCIR_PROGIF		0x09#define PCIR_SUBCLASS		0x0a#define PCIR_CLASS		0x0b#define PCIR_CACHELNSZ		0x0c#define PCIR_LATTIMER		0x0d#define PCIR_HEADERTYPE		0x0e#define PCIM_MFDEV		0x80#define PCIR_BIST		0x0f#define PCIR_CAP_PTR		0x34/* config registers for header type 0 devices */#define PCIR_MAPS	0x10#define PCIR_SUBVEND_0	0x2c#define PCIR_SUBDEV_0	0x2e/****************************** PCI-X definitions *****************************/#define PCIXR_COMMAND	0x96#define PCIXR_DEVADDR	0x98#define PCIXM_DEVADDR_FNUM	0x0003	/* Function Number */#define PCIXM_DEVADDR_DNUM	0x00F8	/* Device Number */#define PCIXM_DEVADDR_BNUM	0xFF00	/* Bus Number */#define PCIXR_STATUS	0x9A#define PCIXM_STATUS_64BIT	0x0001	/* Active 64bit connection to device. */#define PCIXM_STATUS_133CAP	0x0002	/* Device is 133MHz capable */#define PCIXM_STATUS_SCDISC	0x0004	/* Split Completion Discarded */#define PCIXM_STATUS_UNEXPSC	0x0008	/* Unexpected Split Completion */#define PCIXM_STATUS_CMPLEXDEV	0x0010	/* Device Complexity (set == bridge) */#define PCIXM_STATUS_MAXMRDBC	0x0060	/* Maximum Burst Read Count */#define PCIXM_STATUS_MAXSPLITS	0x0380	/* Maximum Split Transactions */#define PCIXM_STATUS_MAXCRDS	0x1C00	/* Maximum Cumulative Read Size */#define PCIXM_STATUS_RCVDSCEM	0x2000	/* Received a Split Comp w/Error msg */extern struct pci_driver aic79xx_pci_driver;typedef enum{	AHD_POWER_STATE_D0,	AHD_POWER_STATE_D1,	AHD_POWER_STATE_D2,	AHD_POWER_STATE_D3} ahd_power_state;void ahd_power_state_change(struct ahd_softc *ahd,			    ahd_power_state new_state);/******************************* PCI Routines *********************************/int			 ahd_linux_pci_init(void);void			 ahd_linux_pci_exit(void);int			 ahd_pci_map_registers(struct ahd_softc *ahd);int			 ahd_pci_map_int(struct ahd_softc *ahd);static __inline uint32_t ahd_pci_read_config(ahd_dev_softc_t pci,					     int reg, int width);static __inline uint32_tahd_pci_read_config(ahd_dev_softc_t pci, int reg, int width){	switch (width) {	case 1:	{		uint8_t retval;		pci_read_config_byte(pci, reg, &retval);		return (retval);	}	case 2:	{		uint16_t retval;		pci_read_config_word(pci, reg, &retval);		return (retval);	}	case 4:	{		uint32_t retval;		pci_read_config_dword(pci, reg, &retval);		return (retval);	}	default:		panic("ahd_pci_read_config: Read size too big");		/* NOTREACHED */		return (0);	}}static __inline void ahd_pci_write_config(ahd_dev_softc_t pci,					  int reg, uint32_t value,					  int width);static __inline voidahd_pci_write_config(ahd_dev_softc_t pci, int reg, uint32_t value, int width){	switch (width) {	case 1:		pci_write_config_byte(pci, reg, value);		break;	case 2:		pci_write_config_word(pci, reg, value);		break;	case 4:		pci_write_config_dword(pci, reg, value);		break;	default:		panic("ahd_pci_write_config: Write size too big");		/* NOTREACHED */	}}static __inline int ahd_get_pci_function(ahd_dev_softc_t);static __inline intahd_get_pci_function(ahd_dev_softc_t pci){	return (PCI_FUNC(pci->devfn));}static __inline int ahd_get_pci_slot(ahd_dev_softc_t);static __inline intahd_get_pci_slot(ahd_dev_softc_t pci){	return (PCI_SLOT(pci->devfn));}static __inline int ahd_get_pci_bus(ahd_dev_softc_t);static __inline intahd_get_pci_bus(ahd_dev_softc_t pci){	return (pci->bus->number);}static __inline void ahd_flush_device_writes(struct ahd_softc *);static __inline voidahd_flush_device_writes(struct ahd_softc *ahd){	/* XXX Is this sufficient for all architectures??? */	ahd_inb(ahd, INTSTAT);}/**************************** Proc FS Support *********************************/int	ahd_linux_proc_info(struct Scsi_Host *, char *, char **,			    off_t, int, int);/*********************** Transaction Access Wrappers **************************/static __inline void ahd_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);static __inline void ahd_set_transaction_status(struct scb *, uint32_t);static __inline void ahd_cmd_set_scsi_status(struct scsi_cmnd *, uint32_t);static __inline void ahd_set_scsi_status(struct scb *, uint32_t);static __inline uint32_t ahd_cmd_get_transaction_status(struct scsi_cmnd *cmd);static __inline uint32_t ahd_get_transaction_status(struct scb *);static __inline uint32_t ahd_cmd_get_scsi_status(struct scsi_cmnd *cmd);static __inline uint32_t ahd_get_scsi_status(struct scb *);static __inline void ahd_set_transaction_tag(struct scb *, int, u_int);static __inline u_long ahd_get_transfer_length(struct scb *);static __inline int ahd_get_transfer_dir(struct scb *);static __inline void ahd_set_residual(struct scb *, u_long);static __inline void ahd_set_sense_residual(struct scb *scb, u_long resid);static __inline u_long ahd_get_residual(struct scb *);static __inline u_long ahd_get_sense_residual(struct scb *);static __inline int ahd_perform_autosense(struct scb *);static __inline uint32_t ahd_get_sense_bufsize(struct ahd_softc *,					       struct scb *);static __inline void ahd_notify_xfer_settings_change(struct ahd_softc *,						     struct ahd_devinfo *);static __inline void ahd_platform_scb_free(struct ahd_softc *ahd,					   struct scb *scb);static __inline void ahd_freeze_scb(struct scb *scb);static __inlinevoid ahd_cmd_set_transaction_status(struct scsi_cmnd *cmd, uint32_t status){	cmd->result &= ~(CAM_STATUS_MASK << 16);	cmd->result |= status << 16;}static __inlinevoid ahd_set_transaction_status(struct scb *scb, uint32_t status){	ahd_cmd_set_transaction_status(scb->io_ctx,status);}static __inlinevoid ahd_cmd_set_scsi_status(struct scsi_cmnd *cmd, uint32_t status){	cmd->result &= ~0xFFFF;	cmd->result |= status;}static __inlinevoid ahd_set_scsi_status(struct scb *scb, uint32_t status){	ahd_cmd_set_scsi_status(scb->io_ctx, status);}static __inlineuint32_t ahd_cmd_get_transaction_status(struct scsi_cmnd *cmd){	return ((cmd->result >> 16) & CAM_STATUS_MASK);}static __inlineuint32_t ahd_get_transaction_status(struct scb *scb){	return (ahd_cmd_get_transaction_status(scb->io_ctx));}static __inlineuint32_t ahd_cmd_get_scsi_status(struct scsi_cmnd *cmd){	return (cmd->result & 0xFFFF);}static __inlineuint32_t ahd_get_scsi_status(struct scb *scb){	return (ahd_cmd_get_scsi_status(scb->io_ctx));}static __inlinevoid ahd_set_transaction_tag(struct scb *scb, int enabled, u_int type){	/*	 * Nothing to do for linux as the incoming transaction	 * has no concept of tag/non tagged, etc.	 */}static __inlineu_long ahd_get_transfer_length(struct scb *scb){	return (scb->platform_data->xfer_len);}static __inlineint ahd_get_transfer_dir(struct scb *scb){	return (scb->io_ctx->sc_data_direction);}static __inlinevoid ahd_set_residual(struct scb *scb, u_long resid){	scb->io_ctx->resid = resid;}static __inlinevoid ahd_set_sense_residual(struct scb *scb, u_long resid){	scb->platform_data->sense_resid = resid;}static __inlineu_long ahd_get_residual(struct scb *scb){	return (scb->io_ctx->resid);}static __inlineu_long ahd_get_sense_residual(struct scb *scb){	return (scb->platform_data->sense_resid);}static __inlineint ahd_perform_autosense(struct scb *scb){	/*	 * We always perform autosense in Linux.	 * On other platforms this is set on a	 * per-transaction basis.	 */	return (1);}static __inline uint32_tahd_get_sense_bufsize(struct ahd_softc *ahd, struct scb *scb){	return (sizeof(struct scsi_sense_data));}static __inline voidahd_notify_xfer_settings_change(struct ahd_softc *ahd,				struct ahd_devinfo *devinfo){	/* Nothing to do here for linux */}static __inline voidahd_platform_scb_free(struct ahd_softc *ahd, struct scb *scb){	ahd->flags &= ~AHD_RESOURCE_SHORTAGE;}int	ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg);void	ahd_platform_free(struct ahd_softc *ahd);void	ahd_platform_init(struct ahd_softc *ahd);void	ahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb);void	ahd_freeze_simq(struct ahd_softc *ahd);void	ahd_release_simq(struct ahd_softc *ahd);static __inline voidahd_freeze_scb(struct scb *scb){	if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {                scb->io_ctx->result |= CAM_DEV_QFRZN << 16;                scb->platform_data->dev->qfrozen++;        }}void	ahd_platform_set_tags(struct ahd_softc *ahd,			      struct ahd_devinfo *devinfo, ahd_queue_alg);int	ahd_platform_abort_scbs(struct ahd_softc *ahd, int target,				char channel, int lun, u_int tag,				role_t role, uint32_t status);irqreturn_t	ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs);void	ahd_platform_flushwork(struct ahd_softc *ahd);int	ahd_softc_comp(struct ahd_softc *, struct ahd_softc *);void	ahd_done(struct ahd_softc*, struct scb*);void	ahd_send_async(struct ahd_softc *, char channel,		       u_int target, u_int lun, ac_code, void *);void	ahd_print_path(struct ahd_softc *, struct scb *);#ifdef CONFIG_PCI#define AHD_PCI_CONFIG 1#else#define AHD_PCI_CONFIG 0#endif#define bootverbose aic79xx_verboseextern uint32_t aic79xx_verbose;#endif /* _AIC79XX_LINUX_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -