|
@@ -52,7 +52,7 @@
|
|
|
|
|
|
|
|
|
/***************************** Lookup Tables **********************************/
|
|
|
-char *ahd_chip_names[] =
|
|
|
+static char *ahd_chip_names[] =
|
|
|
{
|
|
|
"NONE",
|
|
|
"aic7901",
|
|
@@ -237,10 +237,33 @@ static int ahd_handle_target_cmd(struct ahd_softc *ahd,
|
|
|
struct target_cmd *cmd);
|
|
|
#endif
|
|
|
|
|
|
+static int ahd_abort_scbs(struct ahd_softc *ahd, int target,
|
|
|
+ char channel, int lun, u_int tag,
|
|
|
+ role_t role, uint32_t status);
|
|
|
+static void ahd_alloc_scbs(struct ahd_softc *ahd);
|
|
|
+static void ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl,
|
|
|
+ u_int scbid);
|
|
|
+static void ahd_calc_residual(struct ahd_softc *ahd,
|
|
|
+ struct scb *scb);
|
|
|
+static void ahd_clear_critical_section(struct ahd_softc *ahd);
|
|
|
+static void ahd_clear_intstat(struct ahd_softc *ahd);
|
|
|
+static void ahd_enable_coalescing(struct ahd_softc *ahd,
|
|
|
+ int enable);
|
|
|
+static u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl);
|
|
|
+static void ahd_freeze_devq(struct ahd_softc *ahd,
|
|
|
+ struct scb *scb);
|
|
|
+static void ahd_handle_scb_status(struct ahd_softc *ahd,
|
|
|
+ struct scb *scb);
|
|
|
+static struct ahd_phase_table_entry* ahd_lookup_phase_entry(int phase);
|
|
|
+static void ahd_shutdown(void *arg);
|
|
|
+static void ahd_update_coalescing_values(struct ahd_softc *ahd,
|
|
|
+ u_int timer,
|
|
|
+ u_int maxcmds,
|
|
|
+ u_int mincmds);
|
|
|
+static int ahd_verify_vpd_cksum(struct vpd_config *vpd);
|
|
|
+static int ahd_wait_seeprom(struct ahd_softc *ahd);
|
|
|
+
|
|
|
/******************************** Private Inlines *****************************/
|
|
|
-static __inline void ahd_assert_atn(struct ahd_softc *ahd);
|
|
|
-static __inline int ahd_currently_packetized(struct ahd_softc *ahd);
|
|
|
-static __inline int ahd_set_active_fifo(struct ahd_softc *ahd);
|
|
|
|
|
|
static __inline void
|
|
|
ahd_assert_atn(struct ahd_softc *ahd)
|
|
@@ -294,11 +317,44 @@ ahd_set_active_fifo(struct ahd_softc *ahd)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static __inline void
|
|
|
+ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl)
|
|
|
+{
|
|
|
+ ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Determine whether the sequencer reported a residual
|
|
|
+ * for this SCB/transaction.
|
|
|
+ */
|
|
|
+static __inline void
|
|
|
+ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
|
|
|
+{
|
|
|
+ uint32_t sgptr;
|
|
|
+
|
|
|
+ sgptr = ahd_le32toh(scb->hscb->sgptr);
|
|
|
+ if ((sgptr & SG_STATUS_VALID) != 0)
|
|
|
+ ahd_calc_residual(ahd, scb);
|
|
|
+}
|
|
|
+
|
|
|
+static __inline void
|
|
|
+ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb)
|
|
|
+{
|
|
|
+ uint32_t sgptr;
|
|
|
+
|
|
|
+ sgptr = ahd_le32toh(scb->hscb->sgptr);
|
|
|
+ if ((sgptr & SG_STATUS_VALID) != 0)
|
|
|
+ ahd_handle_scb_status(ahd, scb);
|
|
|
+ else
|
|
|
+ ahd_done(ahd, scb);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/************************* Sequencer Execution Control ************************/
|
|
|
/*
|
|
|
* Restart the sequencer program from address zero
|
|
|
*/
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_restart(struct ahd_softc *ahd)
|
|
|
{
|
|
|
|
|
@@ -342,7 +398,7 @@ ahd_restart(struct ahd_softc *ahd)
|
|
|
ahd_unpause(ahd);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo)
|
|
|
{
|
|
|
ahd_mode_state saved_modes;
|
|
@@ -366,7 +422,7 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo)
|
|
|
* Flush and completed commands that are sitting in the command
|
|
|
* complete queues down on the chip but have yet to be dma'ed back up.
|
|
|
*/
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_flush_qoutfifo(struct ahd_softc *ahd)
|
|
|
{
|
|
|
struct scb *scb;
|
|
@@ -905,6 +961,51 @@ ahd_handle_hwerrint(struct ahd_softc *ahd)
|
|
|
ahd_free(ahd);
|
|
|
}
|
|
|
|
|
|
+#ifdef AHD_DEBUG
|
|
|
+static void
|
|
|
+ahd_dump_sglist(struct scb *scb)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (scb->sg_count > 0) {
|
|
|
+ if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) {
|
|
|
+ struct ahd_dma64_seg *sg_list;
|
|
|
+
|
|
|
+ sg_list = (struct ahd_dma64_seg*)scb->sg_list;
|
|
|
+ for (i = 0; i < scb->sg_count; i++) {
|
|
|
+ uint64_t addr;
|
|
|
+ uint32_t len;
|
|
|
+
|
|
|
+ addr = ahd_le64toh(sg_list[i].addr);
|
|
|
+ len = ahd_le32toh(sg_list[i].len);
|
|
|
+ printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
|
|
+ i,
|
|
|
+ (uint32_t)((addr >> 32) & 0xFFFFFFFF),
|
|
|
+ (uint32_t)(addr & 0xFFFFFFFF),
|
|
|
+ sg_list[i].len & AHD_SG_LEN_MASK,
|
|
|
+ (sg_list[i].len & AHD_DMA_LAST_SEG)
|
|
|
+ ? " Last" : "");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ struct ahd_dma_seg *sg_list;
|
|
|
+
|
|
|
+ sg_list = (struct ahd_dma_seg*)scb->sg_list;
|
|
|
+ for (i = 0; i < scb->sg_count; i++) {
|
|
|
+ uint32_t len;
|
|
|
+
|
|
|
+ len = ahd_le32toh(sg_list[i].len);
|
|
|
+ printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
|
|
+ i,
|
|
|
+ (len & AHD_SG_HIGH_ADDR_MASK) >> 24,
|
|
|
+ ahd_le32toh(sg_list[i].addr),
|
|
|
+ len & AHD_SG_LEN_MASK,
|
|
|
+ len & AHD_DMA_LAST_SEG ? " Last" : "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif /* AHD_DEBUG */
|
|
|
+
|
|
|
void
|
|
|
ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
|
|
{
|
|
@@ -2523,7 +2624,7 @@ ahd_force_renegotiation(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
|
|
|
}
|
|
|
|
|
|
#define AHD_MAX_STEPS 2000
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_clear_critical_section(struct ahd_softc *ahd)
|
|
|
{
|
|
|
ahd_mode_state saved_modes;
|
|
@@ -2646,7 +2747,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd)
|
|
|
/*
|
|
|
* Clear any pending interrupt status.
|
|
|
*/
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_clear_intstat(struct ahd_softc *ahd)
|
|
|
{
|
|
|
AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
|
|
@@ -2677,6 +2778,8 @@ ahd_clear_intstat(struct ahd_softc *ahd)
|
|
|
#ifdef AHD_DEBUG
|
|
|
uint32_t ahd_debug = AHD_DEBUG_OPTS;
|
|
|
#endif
|
|
|
+
|
|
|
+#if 0
|
|
|
void
|
|
|
ahd_print_scb(struct scb *scb)
|
|
|
{
|
|
@@ -2701,49 +2804,7 @@ ahd_print_scb(struct scb *scb)
|
|
|
SCB_GET_TAG(scb));
|
|
|
ahd_dump_sglist(scb);
|
|
|
}
|
|
|
-
|
|
|
-void
|
|
|
-ahd_dump_sglist(struct scb *scb)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- if (scb->sg_count > 0) {
|
|
|
- if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) {
|
|
|
- struct ahd_dma64_seg *sg_list;
|
|
|
-
|
|
|
- sg_list = (struct ahd_dma64_seg*)scb->sg_list;
|
|
|
- for (i = 0; i < scb->sg_count; i++) {
|
|
|
- uint64_t addr;
|
|
|
- uint32_t len;
|
|
|
-
|
|
|
- addr = ahd_le64toh(sg_list[i].addr);
|
|
|
- len = ahd_le32toh(sg_list[i].len);
|
|
|
- printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
|
|
- i,
|
|
|
- (uint32_t)((addr >> 32) & 0xFFFFFFFF),
|
|
|
- (uint32_t)(addr & 0xFFFFFFFF),
|
|
|
- sg_list[i].len & AHD_SG_LEN_MASK,
|
|
|
- (sg_list[i].len & AHD_DMA_LAST_SEG)
|
|
|
- ? " Last" : "");
|
|
|
- }
|
|
|
- } else {
|
|
|
- struct ahd_dma_seg *sg_list;
|
|
|
-
|
|
|
- sg_list = (struct ahd_dma_seg*)scb->sg_list;
|
|
|
- for (i = 0; i < scb->sg_count; i++) {
|
|
|
- uint32_t len;
|
|
|
-
|
|
|
- len = ahd_le32toh(sg_list[i].len);
|
|
|
- printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
|
|
|
- i,
|
|
|
- (len & AHD_SG_HIGH_ADDR_MASK) >> 24,
|
|
|
- ahd_le32toh(sg_list[i].addr),
|
|
|
- len & AHD_SG_LEN_MASK,
|
|
|
- len & AHD_DMA_LAST_SEG ? " Last" : "");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+#endif /* 0 */
|
|
|
|
|
|
/************************* Transfer Negotiation *******************************/
|
|
|
/*
|
|
@@ -2906,7 +2967,7 @@ ahd_find_syncrate(struct ahd_softc *ahd, u_int *period,
|
|
|
* Truncate the given synchronous offset to a value the
|
|
|
* current adapter type and syncrate are capable of.
|
|
|
*/
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_validate_offset(struct ahd_softc *ahd,
|
|
|
struct ahd_initiator_tinfo *tinfo,
|
|
|
u_int period, u_int *offset, int wide,
|
|
@@ -2937,7 +2998,7 @@ ahd_validate_offset(struct ahd_softc *ahd,
|
|
|
* Truncate the given transfer width parameter to a value the
|
|
|
* current adapter type is capable of.
|
|
|
*/
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo,
|
|
|
u_int *bus_width, role_t role)
|
|
|
{
|
|
@@ -3466,7 +3527,7 @@ ahd_print_devinfo(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
|
|
|
devinfo->target, devinfo->lun);
|
|
|
}
|
|
|
|
|
|
-struct ahd_phase_table_entry*
|
|
|
+static struct ahd_phase_table_entry*
|
|
|
ahd_lookup_phase_entry(int phase)
|
|
|
{
|
|
|
struct ahd_phase_table_entry *entry;
|
|
@@ -5351,7 +5412,7 @@ ahd_free(struct ahd_softc *ahd)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_shutdown(void *arg)
|
|
|
{
|
|
|
struct ahd_softc *ahd;
|
|
@@ -5480,7 +5541,7 @@ ahd_reset(struct ahd_softc *ahd, int reinit)
|
|
|
/*
|
|
|
* Determine the number of SCBs available on the controller
|
|
|
*/
|
|
|
-int
|
|
|
+static int
|
|
|
ahd_probe_scbs(struct ahd_softc *ahd) {
|
|
|
int i;
|
|
|
|
|
@@ -5929,7 +5990,7 @@ ahd_free_scb(struct ahd_softc *ahd, struct scb *scb)
|
|
|
ahd_platform_scb_free(ahd, scb);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_alloc_scbs(struct ahd_softc *ahd)
|
|
|
{
|
|
|
struct scb_data *scb_data;
|
|
@@ -6982,7 +7043,7 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
|
|
|
ahd_outb(ahd, HCNTRL, hcntrl);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds,
|
|
|
u_int mincmds)
|
|
|
{
|
|
@@ -7000,7 +7061,7 @@ ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds,
|
|
|
ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_enable_coalescing(struct ahd_softc *ahd, int enable)
|
|
|
{
|
|
|
|
|
@@ -7070,6 +7131,7 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd)
|
|
|
ahd->flags &= ~AHD_ALL_INTERRUPTS;
|
|
|
}
|
|
|
|
|
|
+#if 0
|
|
|
int
|
|
|
ahd_suspend(struct ahd_softc *ahd)
|
|
|
{
|
|
@@ -7083,7 +7145,9 @@ ahd_suspend(struct ahd_softc *ahd)
|
|
|
ahd_shutdown(ahd);
|
|
|
return (0);
|
|
|
}
|
|
|
+#endif /* 0 */
|
|
|
|
|
|
+#if 0
|
|
|
int
|
|
|
ahd_resume(struct ahd_softc *ahd)
|
|
|
{
|
|
@@ -7093,6 +7157,7 @@ ahd_resume(struct ahd_softc *ahd)
|
|
|
ahd_restart(ahd);
|
|
|
return (0);
|
|
|
}
|
|
|
+#endif /* 0 */
|
|
|
|
|
|
/************************** Busy Target Table *********************************/
|
|
|
/*
|
|
@@ -7125,7 +7190,7 @@ ahd_index_busy_tcl(struct ahd_softc *ahd, u_int *saved_scbid, u_int tcl)
|
|
|
/*
|
|
|
* Return the untagged transaction id for a given target/channel lun.
|
|
|
*/
|
|
|
-u_int
|
|
|
+static u_int
|
|
|
ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl)
|
|
|
{
|
|
|
u_int scbid;
|
|
@@ -7138,7 +7203,7 @@ ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl)
|
|
|
return (scbid);
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid)
|
|
|
{
|
|
|
u_int scb_offset;
|
|
@@ -7186,7 +7251,7 @@ ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, int target,
|
|
|
return match;
|
|
|
}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb)
|
|
|
{
|
|
|
int target;
|
|
@@ -7690,7 +7755,7 @@ ahd_add_scb_to_free_list(struct ahd_softc *ahd, u_int scbid)
|
|
|
* been modified from CAM_REQ_INPROG. This routine assumes that the sequencer
|
|
|
* is paused before it is called.
|
|
|
*/
|
|
|
-int
|
|
|
+static int
|
|
|
ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel,
|
|
|
int lun, u_int tag, role_t role, uint32_t status)
|
|
|
{
|
|
@@ -8019,18 +8084,8 @@ ahd_stat_timer(void *arg)
|
|
|
}
|
|
|
|
|
|
/****************************** Status Processing *****************************/
|
|
|
-void
|
|
|
-ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb)
|
|
|
-{
|
|
|
- if (scb->hscb->shared_data.istatus.scsi_status != 0) {
|
|
|
- ahd_handle_scsi_status(ahd, scb);
|
|
|
- } else {
|
|
|
- ahd_calc_residual(ahd, scb);
|
|
|
- ahd_done(ahd, scb);
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
|
|
|
{
|
|
|
struct hardware_scb *hscb;
|
|
@@ -8238,10 +8293,21 @@ ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb)
|
|
|
+{
|
|
|
+ if (scb->hscb->shared_data.istatus.scsi_status != 0) {
|
|
|
+ ahd_handle_scsi_status(ahd, scb);
|
|
|
+ } else {
|
|
|
+ ahd_calc_residual(ahd, scb);
|
|
|
+ ahd_done(ahd, scb);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Calculate the residual for a just completed SCB.
|
|
|
*/
|
|
|
-void
|
|
|
+static void
|
|
|
ahd_calc_residual(struct ahd_softc *ahd, struct scb *scb)
|
|
|
{
|
|
|
struct hardware_scb *hscb;
|
|
@@ -9092,6 +9158,7 @@ ahd_dump_card_state(struct ahd_softc *ahd)
|
|
|
ahd_unpause(ahd);
|
|
|
}
|
|
|
|
|
|
+#if 0
|
|
|
void
|
|
|
ahd_dump_scbs(struct ahd_softc *ahd)
|
|
|
{
|
|
@@ -9117,6 +9184,7 @@ ahd_dump_scbs(struct ahd_softc *ahd)
|
|
|
ahd_set_scbptr(ahd, saved_scb_index);
|
|
|
ahd_restore_modes(ahd, saved_modes);
|
|
|
}
|
|
|
+#endif /* 0 */
|
|
|
|
|
|
/**************************** Flexport Logic **********************************/
|
|
|
/*
|
|
@@ -9219,7 +9287,7 @@ ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf,
|
|
|
/*
|
|
|
* Wait ~100us for the serial eeprom to satisfy our request.
|
|
|
*/
|
|
|
-int
|
|
|
+static int
|
|
|
ahd_wait_seeprom(struct ahd_softc *ahd)
|
|
|
{
|
|
|
int cnt;
|
|
@@ -9237,7 +9305,7 @@ ahd_wait_seeprom(struct ahd_softc *ahd)
|
|
|
* Validate the two checksums in the per_channel
|
|
|
* vital product data struct.
|
|
|
*/
|
|
|
-int
|
|
|
+static int
|
|
|
ahd_verify_vpd_cksum(struct vpd_config *vpd)
|
|
|
{
|
|
|
int i;
|
|
@@ -9316,6 +9384,24 @@ ahd_release_seeprom(struct ahd_softc *ahd)
|
|
|
/* Currently a no-op */
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Wait at most 2 seconds for flexport arbitration to succeed.
|
|
|
+ */
|
|
|
+static int
|
|
|
+ahd_wait_flexport(struct ahd_softc *ahd)
|
|
|
+{
|
|
|
+ int cnt;
|
|
|
+
|
|
|
+ AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
|
|
|
+ cnt = 1000000 * 2 / 5;
|
|
|
+ while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt)
|
|
|
+ ahd_delay(5);
|
|
|
+
|
|
|
+ if (cnt == 0)
|
|
|
+ return (ETIMEDOUT);
|
|
|
+ return (0);
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
ahd_write_flexport(struct ahd_softc *ahd, u_int addr, u_int value)
|
|
|
{
|
|
@@ -9357,24 +9443,6 @@ ahd_read_flexport(struct ahd_softc *ahd, u_int addr, uint8_t *value)
|
|
|
return (0);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Wait at most 2 seconds for flexport arbitration to succeed.
|
|
|
- */
|
|
|
-int
|
|
|
-ahd_wait_flexport(struct ahd_softc *ahd)
|
|
|
-{
|
|
|
- int cnt;
|
|
|
-
|
|
|
- AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
|
|
|
- cnt = 1000000 * 2 / 5;
|
|
|
- while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt)
|
|
|
- ahd_delay(5);
|
|
|
-
|
|
|
- if (cnt == 0)
|
|
|
- return (ETIMEDOUT);
|
|
|
- return (0);
|
|
|
-}
|
|
|
-
|
|
|
/************************* Target Mode ****************************************/
|
|
|
#ifdef AHD_TARGET_MODE
|
|
|
cam_status
|