📄 aic7xxx_osm.h
字号:
#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#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)extern struct pci_driver aic7xxx_pci_driver;#endiftypedef enum{ AHC_POWER_STATE_D0, AHC_POWER_STATE_D1, AHC_POWER_STATE_D2, AHC_POWER_STATE_D3} ahc_power_state;/**************************** VL/EISA Routines ********************************/#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) \ && (defined(__i386__) || defined(__alpha__)) \ && (!defined(CONFIG_EISA)))#define CONFIG_EISA#endif#ifdef CONFIG_EISAextern uint32_t aic7xxx_probe_eisa_vl;int ahc_linux_eisa_init(void);void ahc_linux_eisa_exit(void);int aic7770_map_registers(struct ahc_softc *ahc, u_int port);int aic7770_map_int(struct ahc_softc *ahc, u_int irq);#elsestatic inline int ahc_linux_eisa_init(void) { return -ENODEV;}static inline void ahc_linux_eisa_exit(void) {}#endif/******************************* PCI Routines *********************************/#ifdef CONFIG_PCIvoid ahc_power_state_change(struct ahc_softc *ahc, ahc_power_state new_state);int ahc_linux_pci_init(void);void ahc_linux_pci_exit(void);int ahc_pci_map_registers(struct ahc_softc *ahc);int ahc_pci_map_int(struct ahc_softc *ahc);static __inline uint32_t ahc_pci_read_config(ahc_dev_softc_t pci, int reg, int width);static __inline uint32_tahc_pci_read_config(ahc_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("ahc_pci_read_config: Read size too big"); /* NOTREACHED */ return (0); }}static __inline void ahc_pci_write_config(ahc_dev_softc_t pci, int reg, uint32_t value, int width);static __inline voidahc_pci_write_config(ahc_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("ahc_pci_write_config: Write size too big"); /* NOTREACHED */ }}static __inline int ahc_get_pci_function(ahc_dev_softc_t);static __inline intahc_get_pci_function(ahc_dev_softc_t pci){ return (PCI_FUNC(pci->devfn));}static __inline int ahc_get_pci_slot(ahc_dev_softc_t);static __inline intahc_get_pci_slot(ahc_dev_softc_t pci){ return (PCI_SLOT(pci->devfn));}static __inline int ahc_get_pci_bus(ahc_dev_softc_t);static __inline intahc_get_pci_bus(ahc_dev_softc_t pci){ return (pci->bus->number);}#elsestatic inline int ahc_linux_pci_init(void) { return 0;}static inline void ahc_linux_pci_exit(void) {}#endifstatic __inline void ahc_flush_device_writes(struct ahc_softc *);static __inline voidahc_flush_device_writes(struct ahc_softc *ahc){ /* XXX Is this sufficient for all architectures??? */ ahc_inb(ahc, INTSTAT);}#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0)#define pci_map_sg(pdev, sg_list, nseg, direction) (nseg)#define pci_unmap_sg(pdev, sg_list, nseg, direction)#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))#define sg_dma_len(sg) ((sg)->length)#define pci_map_single(pdev, buffer, bufflen, direction) \ (VIRT_TO_BUS(buffer))#define pci_unmap_single(pdev, buffer, buflen, direction)#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)#define ahc_pci_set_dma_mask pci_set_dma_mask#else/* * Always "return" 0 for success. */#define ahc_pci_set_dma_mask(dev_softc, mask) \ (((dev_softc)->dma_mask = mask) && 0)#endif/**************************** Proc FS Support *********************************/#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)int ahc_linux_proc_info(char *, char **, off_t, int, int, int);#elseint ahc_linux_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);#endif/*************************** Domain Validation ********************************/#define AHC_DV_CMD(cmd) ((cmd)->scsi_done == ahc_linux_dv_complete)#define AHC_DV_SIMQ_FROZEN(ahc) \ ((((ahc)->platform_data->flags & AHC_DV_ACTIVE) != 0) \ && (ahc)->platform_data->qfrozen == 1)/*********************** Transaction Access Wrappers *************************/static __inline void ahc_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);static __inline void ahc_set_transaction_status(struct scb *, uint32_t);static __inline void ahc_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);static __inline void ahc_set_scsi_status(struct scb *, uint32_t);static __inline uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd);static __inline uint32_t ahc_get_transaction_status(struct scb *);static __inline uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd);static __inline uint32_t ahc_get_scsi_status(struct scb *);static __inline void ahc_set_transaction_tag(struct scb *, int, u_int);static __inline u_long ahc_get_transfer_length(struct scb *);static __inline int ahc_get_transfer_dir(struct scb *);static __inline void ahc_set_residual(struct scb *, u_long);static __inline void ahc_set_sense_residual(struct scb *scb, u_long resid);static __inline u_long ahc_get_residual(struct scb *);static __inline u_long ahc_get_sense_residual(struct scb *);static __inline int ahc_perform_autosense(struct scb *);static __inline uint32_t ahc_get_sense_bufsize(struct ahc_softc *, struct scb *);static __inline void ahc_notify_xfer_settings_change(struct ahc_softc *, struct ahc_devinfo *);static __inline void ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb);static __inline void ahc_freeze_scb(struct scb *scb);static __inlinevoid ahc_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status){ cmd->result &= ~(CAM_STATUS_MASK << 16); cmd->result |= status << 16;}static __inlinevoid ahc_set_transaction_status(struct scb *scb, uint32_t status){ ahc_cmd_set_transaction_status(scb->io_ctx,status);}static __inlinevoid ahc_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status){ cmd->result &= ~0xFFFF; cmd->result |= status;}static __inlinevoid ahc_set_scsi_status(struct scb *scb, uint32_t status){ ahc_cmd_set_scsi_status(scb->io_ctx, status);}static __inlineuint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd){ return ((cmd->result >> 16) & CAM_STATUS_MASK);}static __inlineuint32_t ahc_get_transaction_status(struct scb *scb){ return (ahc_cmd_get_transaction_status(scb->io_ctx));}static __inlineuint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd){ return (cmd->result & 0xFFFF);}static __inlineuint32_t ahc_get_scsi_status(struct scb *scb){ return (ahc_cmd_get_scsi_status(scb->io_ctx));}static __inlinevoid ahc_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 ahc_get_transfer_length(struct scb *scb){ return (scb->platform_data->xfer_len);}static __inlineint ahc_get_transfer_dir(struct scb *scb){#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40) return (scb->io_ctx->sc_data_direction);#else if (scb->io_ctx->bufflen == 0) return (CAM_DIR_NONE); switch(scb->io_ctx->cmnd[0]) { case 0x08: /* READ(6) */ case 0x28: /* READ(10) */ case 0xA8: /* READ(12) */ return (CAM_DIR_IN); case 0x0A: /* WRITE(6) */ case 0x2A: /* WRITE(10) */ case 0xAA: /* WRITE(12) */ return (CAM_DIR_OUT); default: return (CAM_DIR_NONE); }#endif}static __inlinevoid ahc_set_residual(struct scb *scb, u_long resid){#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) scb->io_ctx->resid = resid;#else scb->platform_data->resid = resid;#endif}static __inlinevoid ahc_set_sense_residual(struct scb *scb, u_long resid){ scb->platform_data->sense_resid = resid;}static __inlineu_long ahc_get_residual(struct scb *scb){#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) return (scb->io_ctx->resid);#else return (scb->platform_data->resid);#endif}static __inlineu_long ahc_get_sense_residual(struct scb *scb){ return (scb->platform_data->sense_resid);}static __inlineint ahc_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_tahc_get_sense_bufsize(struct ahc_softc *ahc, struct scb *scb){ return (sizeof(struct scsi_sense_data));}static __inline voidahc_notify_xfer_settings_change(struct ahc_softc *ahc, struct ahc_devinfo *devinfo){ /* Nothing to do here for linux */}static __inline voidahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb){ ahc->flags &= ~AHC_RESOURCE_SHORTAGE;}int ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);void ahc_platform_free(struct ahc_softc *ahc);void ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb);static __inline voidahc_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 ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, ahc_queue_alg);int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, char channel, int lun, u_int tag, role_t role, uint32_t status);irqreturn_t ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs);void ahc_platform_flushwork(struct ahc_softc *ahc);int ahc_softc_comp(struct ahc_softc *, struct ahc_softc *);void ahc_done(struct ahc_softc*, struct scb*);void ahc_send_async(struct ahc_softc *, char channel, u_int target, u_int lun, ac_code, void *);void ahc_print_path(struct ahc_softc *, struct scb *);void ahc_platform_dump_card_state(struct ahc_softc *ahc);#ifdef CONFIG_PCI#define AHC_PCI_CONFIG 1#else#define AHC_PCI_CONFIG 0#endif#define bootverbose aic7xxx_verboseextern u_int aic7xxx_verbose;#endif /* _AIC7XXX_LINUX_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -