📄 aic79xx_osm.h
字号:
{ spin_unlock_irqrestore(&ahd_list_spinlock, *flags);}#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) */ahd_lockinit(struct ahd_softc *ahd){}static __inline voidahd_lock(struct ahd_softc *ahd, unsigned long *flags){ *flags = 0; save_flags(*flags); cli();}static __inline voidahd_unlock(struct ahd_softc *ahd, unsigned long *flags){ restore_flags(*flags);}ahd_done_lockinit(struct ahd_softc *ahd){}static __inline voidahd_done_lock(struct ahd_softc *ahd, unsigned long *flags){ /* * The done lock is always held while * the ahd lock is held so blocking * interrupts again would have no effect. */}static __inline voidahd_done_unlock(struct ahd_softc *ahd, unsigned long *flags){}static __inline voidahd_list_lockinit(){}static __inline voidahd_list_lock(unsigned long *flags){ *flags = 0; save_flags(*flags); cli();}static __inline voidahd_list_unlock(unsigned long *flags){ restore_flags(*flags);}#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) *//******************************* 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 */#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)extern struct pci_driver aic79xx_pci_driver;#endiftypedef 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 *********************************//* * We need to use the bios32.h routines if we are kernel version 2.1.92 or less. */#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,1,92)#if defined(__sparc_v9__) || defined(__powerpc__)#error "PPC and Sparc platforms are only support under 2.1.92 and above"#endif#include <linux/bios32.h>#endifint ahd_linux_pci_probe(Scsi_Host_Template *);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);}#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 ahd_pci_set_dma_mask pci_set_dma_mask#else/* * Always "return" 0 for success. */#define ahd_pci_set_dma_mask(dev_softc, mask) \ (((dev_softc)->dma_mask = mask) && 0)#endif/*********************** Transaction Access Wrappers **************************/static __inline void ahd_set_transaction_status(struct scb *, uint32_t);static __inlinevoid ahd_set_transaction_status(struct scb *scb, uint32_t status){ scb->io_ctx->result &= ~(CAM_STATUS_MASK << 16); scb->io_ctx->result |= status << 16;}static __inline void ahd_set_scsi_status(struct scb *, uint32_t);static __inlinevoid ahd_set_scsi_status(struct scb *scb, uint32_t status){ scb->io_ctx->result &= ~0xFFFF; scb->io_ctx->result |= status;}static __inline uint32_t ahd_get_transaction_status(struct scb *);static __inlineuint32_t ahd_get_transaction_status(struct scb *scb){ return ((scb->io_ctx->result >> 16) & CAM_STATUS_MASK);}static __inline uint32_t ahd_get_scsi_status(struct scb *);static __inlineuint32_t ahd_get_scsi_status(struct scb *scb){ return (scb->io_ctx->result & 0xFFFF);}static __inline void ahd_set_transaction_tag(struct scb *, int, u_int);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 __inline u_long ahd_get_transfer_length(struct scb *);static __inlineu_long ahd_get_transfer_length(struct scb *scb){ return (scb->platform_data->xfer_len);}static __inline int ahd_get_transfer_dir(struct scb *);static __inlineint ahd_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 __inline void ahd_set_residual(struct scb *, u_long);static __inlinevoid ahd_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 __inline void ahd_set_sense_residual(struct scb *, u_long);static __inlinevoid ahd_set_sense_residual(struct scb *scb, u_long resid){ /* This can't be reported in Linux */}static __inline u_long ahd_get_residual(struct scb *);static __inlineu_long ahd_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 __inline int ahd_perform_autosense(struct scb *);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 void ahd_notify_xfer_settings_change(struct ahd_softc *, struct ahd_devinfo *);static __inline voidahd_notify_xfer_settings_change(struct ahd_softc *ahd, struct ahd_devinfo *devinfo){ /* Nothing to do here for linux */}static __inline void ahd_platform_scb_free(struct ahd_softc *ahd, struct scb *scb);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_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 void ahd_freeze_scb(struct scb *scb);static __inline voidahd_freeze_scb(struct scb *scb){ /* Noting to do here for linux */}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);void 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 *);void ahd_platform_dump_card_state(struct ahd_softc *ahd);#ifdef CONFIG_PCI#define AHD_PCI_CONFIG 1#else#define AHD_PCI_CONFIG 0#endif#define bootverbose aic79xx_verboseextern int aic79xx_verbose;#endif /* _AIC79XX_LINUX_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -