aic7xxx: deinline large functions, save 80k of text
Subsystems (2)
PATCH 1/2 aic7xxx: deinline large functions, save 80k of text
This patch
moves big inlines into aic79xx_core.c and aic7xxx_core.c makes ahd_delay just a wrapper around udelay marks a few functions static
fixes spelling fix in error message
--
vda
drivers/scsi/aic7xxx/aic79xx_core.c +598 -3
@@ -50,6 +50,601 @@#include <dev/aic7xxx/aicasm/aicasm_insformat.h> #endif +/***************************** Timer Facilities *******************************/ +#define ahd_timer_init init_timer +#define ahd_timer_stop del_timer_sync +typedef void ahd_linux_callback_t (u_long ); +static void +ahd_timer_reset (ahd_timer_t *timer,int usec,ahd_callback_t *func,void *arg) +{ +struct ahd_softc *ahd; + + ahd = (struct ahd_softc *)arg; +del_timer (timer); + timer->data = (u_long )arg; + timer->expires = jiffies + (usec *HZ )/1000000 ; + timer->function = (ahd_linux_callback_t *)func; +add_timer (timer); +} + +/***************************** Low Level I/O **********************************/ +uint8_t +ahd_inb (struct ahd_softc * ahd,long port) +{ +uint8_t x; + +if (ahd->tags[0 ] ==BUS_SPACE_MEMIO ) { + x =readb (ahd->bshs[0 ].maddr + port); + }else { + x =inb (ahd->bshs[(port) >>8 ].ioport + ((port) &0xFF )); + } +mb (); +return (x); +} + +uint16_t +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); +} + +void +ahd_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 (); +} + +void +ahd_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 (); +} + +void +ahd_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++); +} + +void +ahd_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); +} + +/************************ Sequencer Execution Control *************************/ +void +ahd_set_modes (struct ahd_softc *ahd,ahd_mode src,ahd_mode dst) +{ +if (ahd->src_mode == src && ahd->dst_mode == dst) +return ; +#ifdef AHD_DEBUG +if (ahd->src_mode ==AHD_MODE_UNKNOWN + || ahd->dst_mode ==AHD_MODE_UNKNOWN ) +panic ("Setting mode prior to saving it.\n" ); +if ((ahd_debug &AHD_SHOW_MODEPTR ) !=0 ) +printf ("%s: Setting mode 0x%x\n" ,ahd_name (ahd), +ahd_build_mode_state (ahd, src, dst)); +#endif +ahd_outb (ahd,MODE_PTR ,ahd_build_mode_state (ahd, src, dst)); + ahd->src_mode = src; + ahd->dst_mode = dst; +} + +void +ahd_update_modes (struct ahd_softc *ahd) +{ +ahd_mode_state mode_ptr; +ahd_mode src; +ahd_mode dst; + + mode_ptr =ahd_inb (ahd,MODE_PTR ); +#ifdef AHD_DEBUG +if ((ahd_debug &AHD_SHOW_MODEPTR ) !=0 ) +printf ("Reading mode 0x%x\n" , mode_ptr); +#endif +ahd_extract_mode_state (ahd, mode_ptr, &src, &dst); +ahd_known_modes (ahd, src, dst); +} + +ahd_mode_state +ahd_save_modes (struct ahd_softc *ahd) +{ +if (ahd->src_mode ==AHD_MODE_UNKNOWN + || ahd->dst_mode ==AHD_MODE_UNKNOWN ) +ahd_update_modes (ahd); + +return (ahd_build_mode_state (ahd, ahd->src_mode, ahd->dst_mode)); +} + +void +ahd_restore_modes (struct ahd_softc *ahd,ahd_mode_state state) +{ +ahd_mode src; +ahd_mode dst; + +ahd_extract_mode_state (ahd, state, &src, &dst); +ahd_set_modes (ahd, src, dst); +} + +/* +* Allow the sequencer to continue program execution. +* We check here to ensure that no additional interrupt +* sources that would cause the sequencer to halt have been +* asserted. If, for example, a SCSI bus reset is detected +* while we are fielding a different, pausing, interrupt type, +* we don't want to release the sequencer before going back +* into our interrupt handler and dealing with this new +* condition. +*/ +void +ahd_unpause (struct ahd_softc *ahd) +{ +/* +* Automatically restore our modes to those saved +* prior to the first change of the mode. +*/ +if (ahd->saved_src_mode !=AHD_MODE_UNKNOWN + && ahd->saved_dst_mode !=AHD_MODE_UNKNOWN ) { +if ((ahd->flags &AHD_UPDATE_PEND_CMDS ) !=0 ) +ahd_reset_cmds_pending (ahd); +ahd_set_modes (ahd, ahd->saved_src_mode, ahd->saved_dst_mode); + } + +if ((ahd_inb (ahd,INTSTAT ) & ~CMDCMPLT ) ==0 ) +ahd_outb (ahd,HCNTRL , ahd->unpause); + +ahd_known_modes (ahd,AHD_MODE_UNKNOWN ,AHD_MODE_UNKNOWN ); +} + +/*********************** Scatter Gather List Handling *************************/ +void * +ahd_sg_setup (struct ahd_softc *ahd,struct scb *scb, +void *sgptr,dma_addr_t addr,bus_size_t len,int last) +{ + scb->sg_count++; +if (sizeof (dma_addr_t) >4 + && (ahd->flags &AHD_64BIT_ADDRESSING ) !=0 ) { +struct ahd_dma64_seg *sg; + + sg = (struct ahd_dma64_seg *)sgptr; + sg->addr =ahd_htole64 (addr); + sg->len =ahd_htole32 (len | (last ?AHD_DMA_LAST_SEG :0 )); +return (sg +1 ); + }else { +struct ahd_dma_seg *sg; + + sg = (struct ahd_dma_seg *)sgptr; + sg->addr =ahd_htole32 (addr &0xFFFFFFFF ); + sg->len =ahd_htole32 (len | ((addr >>8 ) &0x7F000000 ) + | (last ?AHD_DMA_LAST_SEG :0 )); +return (sg +1 ); + } +} + +static void +ahd_setup_scb_common (struct ahd_softc *ahd,struct scb *scb) +{ +/* XXX Handle target mode SCBs. */ + scb->crc_retry_count =0 ; +if ((scb->flags &SCB_PACKETIZED ) !=0 ) { +/* XXX what about ACA?? It is type 4, but TAG_TYPE == 0x3. */ + scb->hscb->task_attribute = scb->hscb->control &SCB_TAG_TYPE ; + }else { +if (ahd_get_transfer_length (scb) &0x01 ) + scb->hscb->task_attribute =SCB_XFERLEN_ODD ; +else + scb->hscb->task_attribute =0 ; + } + +if (scb->hscb->cdb_len <=MAX_CDB_LEN_WITH_SENSE_ADDR + || (scb->hscb->cdb_len &SCB_CDB_LEN_PTR ) !=0 ) + scb->hscb->shared_data.idata.cdb_plus_saddr.sense_addr = +ahd_htole32 (scb->sense_busaddr); +} + +static void +ahd_setup_data_scb (struct ahd_softc *ahd,struct scb *scb) +{ +/* +* Copy the first SG into the "current" data ponter area. +*/ +if ((ahd->flags &AHD_64BIT_ADDRESSING ) !=0 ) { +struct ahd_dma64_seg *sg; + + sg = (struct ahd_dma64_seg *)scb->sg_list; + scb->hscb->dataptr = sg->addr; + scb->hscb->datacnt = sg->len; + }else { +struct ahd_dma_seg *sg; +uint32_t *dataptr_words; + + sg = (struct ahd_dma_seg *)scb->sg_list; + dataptr_words = (uint32_t *)&scb->hscb->dataptr; + dataptr_words[0 ] = sg->addr; + dataptr_words[1 ] =0 ; +if ((ahd->flags &AHD_39BIT_ADDRESSING ) !=0 ) { +uint64_t high_addr; + + high_addr =ahd_le32toh (sg->len) &0x7F000000 ; + scb->hscb->dataptr |=ahd_htole64 (high_addr <<8 ); + } + scb->hscb->datacnt = sg->len; + } +/* +* Note where to find the SG entries in bus space. +* We also set the full residual flag which the +* sequencer will clear as soon as a data transfer +* occurs. +*/ + scb->hscb->sgptr =ahd_htole32 (scb->sg_list_busaddr|SG_FULL_RESID ); +} + +/*********************** Miscelaneous Support Functions ***********************/ +uint16_t +ahd_inw (struct ahd_softc *ahd,u_int port) +{ +/* +* Read high byte first as some registers increment +* or have other side effects when the low byte is +* read. +*/ +return ((ahd_inb (ahd, port+1 ) <<8 ) |ahd_inb (ahd, port)); +} + +void +ahd_outw (struct ahd_softc *ahd,u_int port,u_int value) +{ +/* +* Write low byte first to accomodate registers +* such as PRGMCNT where the order maters. +*/ +ahd_outb (ahd, port, value &0xFF ); +ahd_outb (ahd, port+1 , (value >>8 ) &0xFF ); +} + +uint32_t +ahd_inl (struct ahd_softc *ahd,u_int port) +{ +return ((ahd_inb (ahd, port)) + | (ahd_inb (ahd, port+1 ) <<8 ) + | (ahd_inb (ahd, port+2 ) <<16 ) + | (ahd_inb (ahd, port+3 ) <<24 )); +} + +void +ahd_outl (struct ahd_softc *ahd,u_int port,uint32_t value) +{ +ahd_outb (ahd, port, (value) &0xFF ); +ahd_outb (ahd, port+1 , ((value) >>8 ) &0xFF ); +ahd_outb (ahd, port+2 , ((value) >>16 ) &0xFF ); +ahd_outb (ahd, port+3 , ((value) >>24 ) &0xFF ); +} + +uint64_t +ahd_inq (struct ahd_softc *ahd,u_int port) +{ +return ((ahd_inb (ahd, port)) + | (ahd_inb (ahd, port+1 ) <<8 ) + | (ahd_inb (ahd, port+2 ) <<16 ) + | (ahd_inb (ahd, port+3 ) <<24 ) + | (((uint64_t )ahd_inb (ahd, port+4 )) <<32 ) + | (((uint64_t )ahd_inb (ahd, port+5 )) <<40 ) + | (((uint64_t )ahd_inb (ahd, port+6 )) <<48 ) + | (((uint64_t )ahd_inb (ahd, port+7 )) <<56 )); +} + +void +ahd_outq (struct ahd_softc *ahd,u_int port,uint64_t value) +{ +ahd_outb (ahd, port, value &0xFF ); +ahd_outb (ahd, port+1 , (value >>8 ) &0xFF ); +ahd_outb (ahd, port+2 , (value >>16 ) &0xFF ); +ahd_outb (ahd, port+3 , (value >>24 ) &0xFF ); +ahd_outb (ahd, port+4 , (value >>32 ) &0xFF ); +ahd_outb (ahd, port+5 , (value >>40 ) &0xFF ); +ahd_outb (ahd, port+6 , (value >>48 ) &0xFF ); +ahd_outb (ahd, port+7 , (value >>56 ) &0xFF ); +} + +u_int +ahd_inb_scbram (struct ahd_softc *ahd,u_int offset) +{ +u_int value; + +/* +* Workaround PCI-X Rev A. hardware bug. +* After a host read of SCB memory, the chip +* may become confused into thinking prefetch +* was required. This starts the discard timer +* running and can cause an unexpected discard +* timer interrupt. The work around is to read +* a normal register prior to the exhaustion of +* the discard timer. The mode pointer register +* has no side effects and so serves well for +* this purpose. +* +* Razor #528 +*/ + value =ahd_inb (ahd, offset); +if ((ahd->bugs &AHD_PCIX_SCBRAM_RD_BUG ) !=0 ) +ahd_inb (ahd,MODE_PTR ); +return (value); +} + +u_int +ahd_inw_scbram (struct ahd_softc *ahd,u_int offset) +{ +return (ahd_inb_scbram (ahd, offset) + | (ahd_inb_scbram (ahd, offset+1 ) <<8 )); +} + +uint32_t +ahd_inl_scbram (struct ahd_softc *ahd,u_int offset) +{ +return (ahd_inw_scbram (ahd, offset) + | (ahd_inw_scbram (ahd, offset+2 ) <<16 )); +} + +uint64_t +ahd_inq_scbram (struct ahd_softc *ahd,u_int offset) +{ +return (ahd_inl_scbram (ahd, offset) + | ((uint64_t )ahd_inl_scbram (ahd, offset+4 )) <<32 ); +} + +struct scb * +ahd_lookup_scb (struct ahd_softc *ahd,u_int tag) +{ +struct scb * scb; + +if (tag >=AHD_SCB_MAX ) +return (NULL ); + scb = ahd->scb_data.scbindex[tag]; +if (scb !=NULL ) +ahd_sync_scb (ahd, scb, +BUS_DMASYNC_POSTREAD |BUS_DMASYNC_POSTWRITE ); +return (scb); +} + +static void +ahd_swap_with_next_hscb (struct ahd_softc *ahd,struct scb *scb) +{ +struct hardware_scb *q_hscb; +struct map_node *q_hscb_map; +uint32_t saved_hscb_busaddr; + +/* +* Our queuing method is a bit tricky. The card +* knows in advance which HSCB (by address) to download, +* and we can't disappoint it. To achieve this, the next +* HSCB to download is saved off in ahd->next_queued_hscb. +* When we are called to queue "an arbitrary scb", +* we copy the contents of the incoming HSCB to the one +* the sequencer knows about, swap HSCB pointers and +* finally assign the SCB to the tag indexed location +* in the scb_array. This makes sure that we can still +* locate the correct SCB by SCB_TAG. +*/ + q_hscb = ahd->next_queued_hscb; + q_hscb_map = ahd->next_queued_hscb_map; + saved_hscb_busaddr = q_hscb->hscb_busaddr; +memcpy (q_hscb, scb->hscb,sizeof (*scb->hscb)); + q_hscb->hscb_busaddr = saved_hscb_busaddr; + q_hscb->next_hscb_busaddr = scb->hscb->hscb_busaddr; + +/* Now swap HSCB pointers. */ + ahd->next_queued_hscb = scb->hscb; + ahd->next_queued_hscb_map = scb->hscb_map; + scb->hscb = q_hscb; + scb->hscb_map = q_hscb_map; + +/* Now define the mapping from tag to SCB in the scbindex */ + ahd->scb_data.scbindex[SCB_GET_TAG (scb)] = scb; +} + +/* +* Tell the sequencer about a new transaction to execute. +*/ +void +ahd_queue_scb (struct ahd_softc *ahd,struct scb *scb) +{ +ahd_swap_with_next_hscb (ahd, scb); + +if (SCBID_IS_NULL (SCB_GET_TAG (scb))) +panic ("Attempt to queue invalid SCB tag %x\n" , +SCB_GET_TAG (scb)); + +/* +* Keep a history of SCBs we've downloaded in the qinfifo. +*/ + ahd->qinfifo[AHD_QIN_WRAP (ahd->qinfifonext)] =SCB_GET_TAG (scb); + ahd->qinfifonext++; + +if (scb->sg_count !=0 ) +ahd_setup_data_scb (ahd, scb); +else +ahd_setup_noxfer_scb (ahd, scb); +ahd_setup_scb_common (ahd, scb); + +/* +* Make sure our data is consistent from the +* perspective of the adapter. +*/ +ahd_sync_scb (ahd, scb,BUS_DMASYNC_PREREAD |BUS_DMASYNC_PREWRITE ); + +#ifdef AHD_DEBUG +if ((ahd_debug &AHD_SHOW_QUEUE ) !=0 ) { +uint64_t host_dataptr; + + host_dataptr =ahd_le64toh (scb->hscb->dataptr); +printf ("%s: Queueing SCB %d:0x%x bus addr 0x%x - 0x%x%x/0x%x\n" , +ahd_name (ahd), +SCB_GET_TAG (scb), scb->hscb->scsiid, +ahd_le32toh (scb->hscb->hscb_busaddr), + (u_int)((host_dataptr >>32 ) &0xFFFFFFFF ), + (u_int)(host_dataptr &0xFFFFFFFF ), +ahd_le32toh (scb->hscb->datacnt)); + } +#endif +/* Tell the adapter about the newly queued SCB */ +ahd_set_hnscb_qoff (ahd, ahd->qinfifonext); +} + +/************************** Interrupt Processing ******************************/ +/* +* See if the firmware has posted any completed commands +* into our in-core command complete fifos. +*/ +#define AHD_RUN_QOUTFIFO 0x1 +#define AHD_RUN_TQINFIFO 0x2 +static u_int +ahd_check_cmdcmpltqueues (struct ahd_softc *ahd) +{ +u_int retval; + + retval =0 ; +ahd_dmamap_sync (ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap, +/*offset*/ ahd->qoutfifonext *sizeof (*ahd->qoutfifo), +/*len*/ sizeof (*ahd->qoutfifo),BUS_DMASYNC_POSTREAD ); +if (ahd->qoutfifo[ahd->qoutfifonext].valid_tag + == ahd->qoutfifonext_valid_tag) + retval |=AHD_RUN_QOUTFIFO ; +#ifdef AHD_TARGET_MODE +if ((ahd->flags &AHD_TARGETROLE ) !=0 + && (ahd->flags &AHD_TQINFIFO_BLOCKED ) ==0 ) { +ahd_dmamap_sync (ahd, ahd->shared_data_dmat, + ahd->shared_data_map.dmamap, +ahd_targetcmd_offset (ahd, ahd->tqinfifofnext), +/*len*/ sizeof (struct target_cmd ), +BUS_DMASYNC_POSTREAD ); +if (ahd->targetcmds[ahd->tqinfifonext].cmd_valid !=0 ) + retval |=AHD_RUN_TQINFIFO ; + } +#endif +return (retval); +} + +/* +* Catch an interrupt from the adapter +*/ +int +ahd_intr (struct ahd_softc *ahd) +{ +u_int intstat; + +if ((ahd->pause &INTEN ) ==0 ) { +/* +* Our interrupt is not enabled on the chip +* and may be disabled for re-entrancy reasons, +* so just return. This is likely just a shared +* interrupt. +*/ +return (0 ); + } + +/* +* Instead of directly reading the interrupt status register, +* infer the cause of the interrupt by checking our in-core +* completion queues. This avoids a costly PCI bus read in +* most cases. +*/ +if ((ahd->flags &AHD_ALL_INTERRUPTS ) ==0 + && (ahd_check_cmdcmpltqueues (ahd) !=0 )) + intstat =CMDCMPLT ; +else + intstat =ahd_inb (ahd,INTSTAT ); + +if ((intstat &INT_PEND ) ==0 ) +return (0 ); + +if (intstat &CMDCMPLT ) { +ahd_outb (ahd,CLRINT ,CLRCMDINT ); + +/* +* Ensure that the chip sees that we've cleared +* this interrupt before we walk the output fifo. +* Otherwise, we may, due to posted bus writes, +* clear the interrupt after we finish the scan, +* and after the sequencer has added new entries +* and asserted the interrupt again. +*/ +if ((ahd->bugs &AHD_INTCOLLISION_BUG ) !=0 ) { +if (ahd_is_paused (ahd)) { +/* +* Potentially lost SEQINT. +* If SEQINTCODE is non-zero, +* simulate the SEQINT. +*/ +if (ahd_inb (ahd,SEQINTCODE ) !=NO_SEQINT ) + intstat |=SEQINT ; + } + }else { +ahd_flush_device_writes (ahd); + } +ahd_run_qoutfifo (ahd); + ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]++; + ahd->cmdcmplt_total++; +#ifdef AHD_TARGET_MODE +if ((ahd->flags &AHD_TARGETROLE ) !=0 ) +ahd_run_tqinfifo (ahd,/*paused*/ FALSE); +#endif + } + +/* +* Handle statuses that may invalidate our cached +* copy of INTSTAT separately. +*/ +if (intstat ==0xFF && (ahd->features &AHD_REMOVABLE ) !=0 ) { +/* Hot eject. Do nothing */ + }else if (intstat &HWERRINT ) { +ahd_handle_hwerrint (ahd); + }else if ((intstat & (PCIINT |SPLTINT )) !=0 ) { + ahd->bus_intr (ahd); + }else { + +if ((intstat &SEQINT ) !=0 ) +ahd_handle_seqint (ahd, intstat); + +if ((intstat &SCSIINT ) !=0 ) +ahd_handle_scsiint (ahd, intstat); + } +return (1 ); +}/***************************** Lookup Tables **********************************/ static char *ahd_chip_names[] =
@@ -304,7 +899,7 @@ ahd_currently_packetized(struct ahd_softreturn (packetized); } -static __inlineint +static int ahd_set_active_fifo (struct ahd_softc *ahd) {u_int active_fifo;
@@ -7192,7 +7787,7 @@ ahd_resume(struct ahd_softc *ahd)* scbid that should be restored once manipualtion * of the TCL entry is complete. */ -static __inlineu_int +static u_int ahd_index_busy_tcl (struct ahd_softc *ahd,u_int *saved_scbid,u_int tcl) {/*
@@ -8327,7 +8922,7 @@ ahd_handle_scsi_status(struct ahd_softcbreak ; }case SCSI_STATUS_OK : -printf ("%s: Interrupted for staus of 0???\n" , +printf ("%s: Interrupted for status of 0???\n" ,ahd_name (ahd));/* FALLTHROUGH */ default :
drivers/scsi/aic7xxx/aic79xx_inline.h +19 -529
621 lines not on this page · raw message
drivers/scsi/aic7xxx/aic79xx_osm.c +1 -1
@@ -462,7 +462,7 @@ ahd_linux_queue(struct scsi_cmnd * cmd,return rtn; } -static inline struct scsi_target ** +static struct scsi_target **ahd_linux_target_in_softc (struct scsi_target *starget) { struct ahd_softc *ahd =
drivers/scsi/aic7xxx/aic79xx_osm.h +11 -119
168 lines not on this page · raw message
drivers/scsi/aic7xxx/aic7xxx_core.c +359 -0
365 lines not on this page · raw message
drivers/scsi/aic7xxx/aic7xxx_inline.h +13 -323
360 lines not on this page · raw message
drivers/scsi/aic7xxx/aic7xxx_osm.c +3 -3
@@ -392,7 +392,7 @@ static int ahc_linux_unit;/********************************* Inlines ************************************/ static __inlinevoid ahc_linux_unmap_scb (struct ahc_softc *,struct scb *); -static __inlineint ahc_linux_map_seg (struct ahc_softc *ahc,struct scb *scb, +static int ahc_linux_map_seg (struct ahc_softc *ahc,struct scb *scb,struct ahc_dma_seg *sg,dma_addr_t addr,bus_size_t len);
@@ -417,7 +417,7 @@ ahc_linux_unmap_scb(struct ahc_softc *ah } } -static __inlineint +static int ahc_linux_map_seg (struct ahc_softc *ahc,struct scb *scb,struct ahc_dma_seg *sg,dma_addr_t addr,bus_size_t len) {
@@ -491,7 +491,7 @@ ahc_linux_queue(struct scsi_cmnd * cmd,return rtn; } -static inline struct scsi_target ** +static struct scsi_target **ahc_linux_target_in_softc (struct scsi_target *starget) { struct ahc_softc *ahc =
drivers/scsi/aic7xxx/aic7xxx_osm.h +11 -74
113 lines not on this page · raw message
PATCH 2/2 aic7xxx: s/__inline/inline
Global s/__inline/inline/ in aic7xxx driver
--
vda
drivers/scsi/aic7xxx/aic79xx_core.c +5 -5
@@ -864,7 +864,7 @@ static int ahd_match_scb(struct ahd_sof/******************************** Private Inlines *****************************/ -static __inlinevoid +static inline void ahd_assert_atn (struct ahd_softc *ahd) {ahd_outb (ahd,SCSISIGO ,ATNO );
@@ -876,7 +876,7 @@ ahd_assert_atn(struct ahd_softc *ahd)* are currently in a packetized transfer. We could * just as easily be sending or receiving a message. */ -static __inlineint +static inline int ahd_currently_packetized (struct ahd_softc *ahd) {ahd_mode_state saved_modes;
@@ -916,7 +916,7 @@ ahd_set_active_fifo(struct ahd_softc *ah } } -static __inlinevoid +static inline void ahd_unbusy_tcl (struct ahd_softc *ahd,u_int tcl) {ahd_busy_tcl (ahd, tcl,SCB_LIST_NULL );
@@ -926,7 +926,7 @@ ahd_unbusy_tcl(struct ahd_softc *ahd, u_* Determine whether the sequencer reported a residual * for this SCB/transaction. */ -static __inlinevoid +static inline void ahd_update_residual (struct ahd_softc *ahd,struct scb *scb) {uint32_t sgptr;
@@ -936,7 +936,7 @@ ahd_update_residual(struct ahd_softc *ahahd_calc_residual (ahd, scb); } -static __inlinevoid +static inline void ahd_complete_scb (struct ahd_softc *ahd,struct scb *scb) {uint32_t sgptr;
drivers/scsi/aic7xxx/aic79xx_inline.h +64 -64
366 lines not on this page · raw message
drivers/scsi/aic7xxx/aic79xx_osm.c +2 -2
@@ -388,9 +388,9 @@ static int ahd_linux_unit;/****************************** Inlines ***************************************/ -static __inlinevoid ahd_linux_unmap_scb (struct ahd_softc *,struct scb *); +static inline void ahd_linux_unmap_scb (struct ahd_softc *,struct scb *); -static __inlinevoid +static inline void ahd_linux_unmap_scb (struct ahd_softc *ahd,struct scb *scb) {struct scsi_cmnd *cmd;
drivers/scsi/aic7xxx/aic79xx_osm.h +55 -55
275 lines not on this page · raw message
drivers/scsi/aic7xxx/aic79xx_pci.c +1 -1
@@ -51,7 +51,7 @@#include "aic79xx_pci.h" -static __inlineuint64_t +static inline uint64_t ahd_compose_id (u_int device,u_int vendor,u_int subdevice,u_int subvendor) {uint64_t id;
drivers/scsi/aic7xxx/aic7xxx_inline.h +38 -38
229 lines not on this page · raw message
drivers/scsi/aic7xxx/aic7xxx_osm.c +2 -2
@@ -390,13 +390,13 @@ static int ahc_linux_unit;/********************************* Inlines ************************************/ -static __inlinevoid ahc_linux_unmap_scb (struct ahc_softc *,struct scb *); +static inline void ahc_linux_unmap_scb (struct ahc_softc *,struct scb *);static int ahc_linux_map_seg (struct ahc_softc *ahc,struct scb *scb,struct ahc_dma_seg *sg,dma_addr_t addr,bus_size_t len); -static __inlinevoid +static inline void ahc_linux_unmap_scb (struct ahc_softc *ahc,struct scb *scb) {struct scsi_cmnd *cmd;
drivers/scsi/aic7xxx/aic7xxx_osm.h +56 -56
284 lines not on this page · raw message
drivers/scsi/aic7xxx/aic7xxx_pci.c +1 -1
@@ -54,7 +54,7 @@#include "aic7xxx_pci.h" -static __inlineuint64_t +static inline uint64_t ahc_compose_id (u_int device,u_int vendor,u_int subdevice,u_int subvendor) {uint64_t id;
drivers/scsi/aic7xxx/aiclib.h +2 -2
@@ -133,7 +133,7 @@ struct scsi_sense_data#define SCSI_STATUS_TASK_ABORTED 0x40/************************* Large Disk Handling ********************************/ -static __inlineint +static inline int aic_sector_div (sector_t capacity,int heads,int sectors) {/* ugly, ugly sector_div calling convention.. */
@@ -141,7 +141,7 @@ aic_sector_div(sector_t capacity, int hereturn (int )capacity; } -static __inlineuint32_t +static inline uint32_t scsi_4btoul (uint8_t *bytes) {uint32_t rv;
Quoted 6 lines · Denis Vlasenko
This patch
moves big inlines into
aic79xx_core.candaic7xxx_core.cmakesahd_delayjust a wrapper around udelay marks a few functions static
fixes spelling fix in error message
While you're at it; can't you move the different ah{c,d}_{in,out}.* into one place? Have them scattered throughout the file doesn't really make sense.
Otherwise ACK.
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke [email protected] SuSE Linux Products GmbH S390 & zSeries Maxfeldstraße 5 +49 911 74053 688 90409 Nürnberg http://www.suse.de - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 6 lines · Denis Vlasenko
This patch
moves big inlines into
aic79xx_core.candaic7xxx_core.cmakesahd_delayjust a wrapper around udelay marks a few functions static
fixes spelling fix in error message
There are two things that really spring to mind here
1. This alters the Adaptec HIM layer (the machine independent bit). I think no one cares about this anymore, so that's fine. However, if you're going to do this, do it properly, so get rid of the superfluous HIM layer abstractions like this:
#define ahd_timer_init init_timer
#define ahd_timer_stop del_timer_sync
typedef void ahd_linux_callback_t (u_long);
Just make it use the linux types natively.
2. There's no actual code content to this, which always makes me reluctant to accept changes. However, I notice this alters the inb/outb abstractions, so what you could do, if you were feeling brave is eliminate the Adaptec implementation of ioread8/iowrite8 and replace it with the linux one (i.e. use ioport_map if the card really wants port I/O). This has been on my Todo list for a long time; even if you haven't got the hardware, Hannes and I can test it for you.
Note that you can't use ioread16 or any of the longer reads or writes. The adaptec cards have terrible problems with write combining, so everything needs to still be done in terms of ioread8/iowrite8
James
Quoted 15 lines · James Bottomley
Quoted 6 lines · Denis Vlasenko
This patch
moves big inlines into
aic79xx_core.candaic7xxx_core.cmakesahd_delayjust a wrapper around udelay marks a few functions static
fixes spelling fix in error messageThere are two things that really spring to mind here
1. This alters the Adaptec HIM layer (the machine independent bit). I think no one cares about this anymore, so that's fine. However, if you're going to do this, do it properly, so get rid of the superfluous HIM layer abstractions like this:
Quoted 5 lines
#define
ahd_timer_initinit_timer
#defineahd_timer_stopdel_timer_sync
typedef voidahd_linux_callback_t(u_long);Just make it use the linux types natively.
This is easy. See attached patch. It also incorporates changes made by Adrian Bunk.
Quoted 7 lines
2. There's no actual code content to this, which always makes me reluctant to accept changes. However, I notice this alters the inb/outb abstractions, so what you could do, if you were feeling brave is eliminate the Adaptec implementation of ioread8/iowrite8 and replace it with the linux one (i.e. use
ioport_mapif the card really wants port I/O). This has been on my Todo list for a long time; even if you haven't got the hardware, Hannes and I can test it for you.
I looked into it, and tried to do the conversion, but stumbled upon this:
uint8_tahd_inb(struct ahd_softc * ahd, long port)
{
uint8_t x;
if (ahd->tags[0] == BUS_SPACE_MEMIO) {
x = readb(ahd->bshs[0].maddr + port);
} else {
x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
mb();
return (x);
}After some surgery on ahd_linux_pci_reserve_io/mem_regions() I can coerce it into using iomem* pointers instead of bus_space_handle_t union, but I still cannot use ioread8() instead of ahd_inb()
because of the ^^^ code above.
I don't think it makes sense to try to convert it to ioread8() and friends. It will just add (not replace) yet another indirection...
Quoted 3 lines
Note that you can't use ioread16 or any of the longer reads or writes. The adaptec cards have terrible problems with write combining, so everything needs to still be done in terms of ioread8/iowrite8
I looked at the code. This hardware must be, um, "interesting". --
vda
drivers/scsi/aic7xxx/aic79xx.h +0 -6
@@ -1336,7 +1336,6 @@ extern const int ahd_num_aic7770_devs;/*************************** Function Declarations ****************************/ /******************************************************************************/ -void ahd_reset_cmds_pending (struct ahd_softc *ahd);/***************************** PCI Front End *********************************/ struct ahd_pci_identity *ahd_find_pci_device (ahd_dev_softc_t );
@@ -1373,14 +1372,9 @@ int ahd_read_flexport(struct ahd_soft uint8_t *value);/*************************** Interrupt Services *******************************/ -void ahd_run_qoutfifo (struct ahd_softc *ahd);#ifdef AHD_TARGET_MODE void ahd_run_tqinfifo (struct ahd_softc *ahd,int paused);#endif -void ahd_handle_hwerrint (struct ahd_softc *ahd); -void ahd_handle_seqint (struct ahd_softc *ahd,u_int intstat); -void ahd_handle_scsiint (struct ahd_softc *ahd, -u_int intstat);/***************************** Error Recovery *********************************/ typedef enum {
drivers/scsi/aic7xxx/aic79xx_core.c +25 -18
141 lines not on this page · raw message
drivers/scsi/aic7xxx/aic79xx_inline.h +0 -5
@@ -65,7 +65,6 @@ static inline void ahd_extract_mode_stat ahd_mode *src, ahd_mode *dst);void ahd_set_modes (struct ahd_softc *ahd,ahd_mode src,ahd_mode dst); -void ahd_update_modes (struct ahd_softc *ahd);static inline void ahd_assert_modes (struct ahd_softc *ahd,ahd_mode srcmode,ahd_mode dstmode,const char *file,int line);
@@ -257,8 +256,6 @@ uint16_t ahd_inw(struct ahd_softc *ahd,void ahd_outw (struct ahd_softc *ahd,u_int port,u_int value);uint32_t ahd_inl (struct ahd_softc *ahd,u_int port);void ahd_outl (struct ahd_softc *ahd,u_int port,uint32_t value); -uint64_t ahd_inq (struct ahd_softc *ahd,u_int port); -void ahd_outq (struct ahd_softc *ahd,u_int port,uint64_t value);static inline u_int ahd_get_scbptr (struct ahd_softc *ahd);static inline void ahd_set_scbptr (struct ahd_softc *ahd,u_int scbptr);static inline u_int ahd_get_hnscb_qoff (struct ahd_softc *ahd);
@@ -273,8 +270,6 @@ static inline u_int ahd_get_sdscb_qoff(sstatic inline void ahd_set_sdscb_qoff (struct ahd_softc *ahd,u_int value);u_int ahd_inb_scbram (struct ahd_softc *ahd,u_int offset);u_int ahd_inw_scbram (struct ahd_softc *ahd,u_int offset); -uint32_t ahd_inl_scbram (struct ahd_softc *ahd,u_int offset); -uint64_t ahd_inq_scbram (struct ahd_softc *ahd,u_int offset);struct scb *ahd_lookup_scb (struct ahd_softc *ahd,u_int tag);void ahd_queue_scb (struct ahd_softc *ahd,struct scb *scb); static inline uint8_t *
drivers/scsi/aic7xxx/aic79xx_osm.c +4 -2
@@ -383,6 +383,8 @@ static int ahd_linux_run_command(struct struct scsi_cmnd *);static void ahd_linux_setup_tag_info_global (char *p);static int aic79xx_setup (char *c); +static void ahd_freeze_simq (struct ahd_softc *ahd); +static void ahd_release_simq (struct ahd_softc *ahd);static int ahd_linux_unit;
@@ -2077,13 +2079,13 @@ ahd_linux_queue_cmd_complete(struct ahd_ cmd->scsi_done (cmd); } -void +static void ahd_freeze_simq (struct ahd_softc *ahd) {scsi_block_requests (ahd->platform_data->host); } -void +static void ahd_release_simq (struct ahd_softc *ahd) {scsi_unblock_requests (ahd->platform_data->host);
drivers/scsi/aic7xxx/aic79xx_osm.h +0 -6
@@ -387,10 +387,6 @@ uint16_t ahd_inw_atomic(struct ahd_softcvoid ahd_outb (struct ahd_softc * ahd,long port,uint8_t val);void ahd_outw_atomic (struct ahd_softc * ahd,long port,uint16_t val); -void ahd_outsb (struct ahd_softc * ahd,long port, -uint8_t *,int count); -void ahd_insb (struct ahd_softc * ahd,long port, -uint8_t *,int count);/**************************** Initialization **********************************/ int ahd_linux_register_host(struct ahd_softc *,
@@ -740,8 +736,6 @@ int ahd_platform_alloc(struct ahd_softcvoid 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 void ahd_freeze_scb (struct scb *scb)
drivers/scsi/aic7xxx/aic7xxx.h +0 -6
@@ -1192,21 +1192,15 @@ int ahc_suspend(struct ahc_softc *ahcint ahc_resume (struct ahc_softc *ahc);void ahc_set_unit (struct ahc_softc *,int );void ahc_set_name (struct ahc_softc *,char *); -void ahc_alloc_scbs (struct ahc_softc *ahc);void ahc_free (struct ahc_softc *ahc);int ahc_reset (struct ahc_softc *ahc,int reinit);void ahc_shutdown (void *arg);/*************************** Interrupt Services *******************************/ void ahc_clear_intstat (struct ahc_softc *ahc); -void ahc_run_qoutfifo (struct ahc_softc *ahc);#ifdef AHC_TARGET_MODE void ahc_run_tqinfifo (struct ahc_softc *ahc,int paused);#endif -void ahc_handle_brkadrint (struct ahc_softc *ahc); -void ahc_handle_seqint (struct ahc_softc *ahc,u_int intstat); -void ahc_handle_scsiint (struct ahc_softc *ahc, -u_int intstat);void ahc_clear_critical_section (struct ahc_softc *ahc);/***************************** Error Recovery *********************************/
drivers/scsi/aic7xxx/aic7xxx_core.c +19 -7
@@ -50,6 +50,12 @@#include <dev/aic7xxx/aicasm/aicasm_insformat.h> #endif +static void ahc_alloc_scbs (struct ahc_softc *ahc); +static void ahc_handle_brkadrint (struct ahc_softc *ahc); +static void ahc_handle_scsiint (struct ahc_softc *ahc,u_int intstat); +static void ahc_handle_seqint (struct ahc_softc *ahc,u_int intstat); +static void ahc_run_qoutfifo (struct ahc_softc *ahc); +/***************************** Low Level I/O **********************************/ uint8_t ahc_inb (struct ahc_softc * ahc,long port)
@@ -76,7 +82,7 @@ ahc_outb(struct ahc_softc * ahc, long pomb (); } -void +static void ahc_outsb (struct ahc_softc * ahc,long port,uint8_t *array,int count) {int i;
@@ -90,7 +96,8 @@ ahc_outsb(struct ahc_softc * ahc, long pahc_outb (ahc, port, *array++); } -void +#ifdef AHC_DUMP_SEQ +static void ahc_insb (struct ahc_softc * ahc,long port,uint8_t *array,int count) {int i;
@@ -103,6 +110,7 @@ ahc_insb(struct ahc_softc * ahc, long pofor (i =0 ; i < count; i++) *array++ = ahc_inb(ahc, port); } +#endif /* AHC_DUMP_SEQ */ /*********************** Miscelaneous Support Functions ***********************/ uint16_t
@@ -136,6 +144,8 @@ ahc_outl(struct ahc_softc *ahc, u_int poahc_outb (ahc, port+3 , ((value) >>24 ) &0xFF ); } +#if 0 +uint64_t ahc_inq (struct ahc_softc *ahc,u_int port) {
@@ -162,6 +172,8 @@ ahc_outq(struct ahc_softc *ahc, u_int po ahc_outb(ahc, port+7, (value >> 56) & 0xFF); } +#endif /* 0 */ +/* * Get a free scb. If there are none, see if we can allocate a new SCB. */
@@ -661,7 +673,7 @@ ahc_restart(struct ahc_softc *ahc) }/************************* Input/Output Queues ********************************/ -void +static void ahc_run_qoutfifo (struct ahc_softc *ahc) {struct scb *scb;
@@ -733,7 +745,7 @@ ahc_run_untagged_queue(struct ahc_softc }/************************* Interrupt Handling *********************************/ -void +static void ahc_handle_brkadrint (struct ahc_softc *ahc) {/*
@@ -762,7 +774,7 @@ ahc_handle_brkadrint(struct ahc_softc *aahc_shutdown (ahc); } -void +static void ahc_handle_seqint (struct ahc_softc *ahc,u_int intstat) {struct scb *scb;
@@ -1312,7 +1324,7 @@ unpause:ahc_unpause (ahc); } -void +static void ahc_handle_scsiint (struct ahc_softc *ahc,u_int intstat) {u_int scb_index;
@@ -4724,7 +4736,7 @@ ahc_fini_scbdata(struct ahc_softc *ahc)free (scb_data->scbarray,M_DEVBUF ); } -void +static void ahc_alloc_scbs (struct ahc_softc *ahc) {struct scb_data *scb_data;
drivers/scsi/aic7xxx/aic7xxx_inline.h +0 -2
@@ -242,8 +242,6 @@ uint16_t ahc_inw(struct ahc_softc *ahc,void ahc_outw (struct ahc_softc *ahc,u_int port,u_int value);uint32_t ahc_inl (struct ahc_softc *ahc,u_int port);void ahc_outl (struct ahc_softc *ahc,u_int port,uint32_t value); -uint64_t ahc_inq (struct ahc_softc *ahc,u_int port); -void ahc_outq (struct ahc_softc *ahc,u_int port,uint64_t value);struct scb *ahc_get_scb (struct ahc_softc *ahc);void ahc_free_scb (struct ahc_softc *ahc,struct scb *scb);
drivers/scsi/aic7xxx/aic7xxx_osm.h +0 -4
@@ -392,10 +392,6 @@ static inline void ahc_delay(int usec)/***************************** Low Level I/O **********************************/ uint8_t ahc_inb (struct ahc_softc * ahc,long port);void ahc_outb (struct ahc_softc * ahc,long port,uint8_t val); -void ahc_outsb (struct ahc_softc * ahc,long port, -uint8_t *,int count); -void ahc_insb (struct ahc_softc * ahc,long port, -uint8_t *,int count);/**************************** Initialization **********************************/ int ahc_linux_register_host(struct ahc_softc *,