From af4394d40ac13e07d87b5cf74bb0c20230136a70 Mon Sep 17 00:00:00 2001 From: Matt Jacob Date: Fri, 23 Feb 2007 21:59:21 +0000 Subject: [PATCH] Don't attempt to load illegal hard loop addresses into an ICB. This shows up on card restarts, and usually for 2200-2300 cards. What happens is that we start up, attempting to acquire a hard address. We end up instead being an F-port topology, which reports out a loop id of 0xff (or 0xffff for 2K Login f/w). Then, if we restart, we end up telling the card to go off an acquire this loop address, which the card then rejects. Bah. Compilation fixes from Solaris port. --- sys/dev/isp/isp.c | 62 +++++++++++++++---------------------------- sys/dev/isp/ispmbox.h | 2 +- sys/dev/isp/ispreg.h | 16 +++++------ 3 files changed, 31 insertions(+), 49 deletions(-) diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index 008a534a89f3..e504325cbfbc 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -1555,6 +1555,7 @@ isp_fibre_init(ispsoftc_t *isp) fcparam *fcp; isp_icb_t local, *icbp = &local; mbreg_t mbs; + int ownloopid; uint64_t nwwn, pwwn; fcp = isp->isp_param; @@ -1630,25 +1631,17 @@ isp_fibre_init(ispsoftc_t *isp) icbp->icb_retry_delay = fcp->isp_retry_delay; icbp->icb_retry_count = fcp->isp_retry_count; icbp->icb_hardaddr = fcp->isp_loopid; + ownloopid = (isp->isp_confopts & ISP_CFG_OWNLOOPID) != 0; if (icbp->icb_hardaddr > 125) { - /* - * We end up with these Loop IDs for F-Port topologies - */ - if (icbp->icb_hardaddr != 0xff && - icbp->icb_hardaddr != 0x800 && - icbp->icb_hardaddr != 0xffff) { - isp_prt(isp, ISP_LOGERR, - "bad hard address %u- resetting to zero", - icbp->icb_hardaddr); - icbp->icb_hardaddr = 0; - } + icbp->icb_hardaddr = 0; + ownloopid = 0; } /* * Our life seems so much better with 2200s and later with * the latest f/w if we set Hard Address. */ - if (ISP_FW_NEWER_THAN(isp, 2, 2, 5)) { + if (ownloopid || ISP_FW_NEWER_THAN(isp, 2, 2, 5)) { icbp->icb_fwoptions |= ICBOPT_HARD_ADDRESS; } @@ -1800,6 +1793,7 @@ isp_fibre_init(ispsoftc_t *isp) isp_mboxcmd(isp, &mbs); FC_SCRATCH_RELEASE(isp); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { + isp_print_bytes(isp, "isp_fibre_init", sizeof (*icbp), icbp); return; } isp->isp_reqidx = 0; @@ -1818,6 +1812,7 @@ isp_fibre_init_2400(ispsoftc_t *isp) fcparam *fcp; isp_icb_2400_t local, *icbp = &local; mbreg_t mbs; + int ownloopid; uint64_t nwwn, pwwn; fcp = isp->isp_param; @@ -1886,21 +1881,12 @@ isp_fibre_init_2400(ispsoftc_t *isp) icbp->icb_fwoptions1 = fcp->isp_fwoptions; icbp->icb_hardaddr = fcp->isp_loopid; + ownloopid = (isp->isp_confopts & ISP_CFG_OWNLOOPID) != 0; if (icbp->icb_hardaddr > 125) { - /* - * We end up with these Loop IDs for F-Port topologies - */ - if (icbp->icb_hardaddr != 0xff && - icbp->icb_hardaddr != 0x800 && - icbp->icb_hardaddr != 0xffff) { - isp_prt(isp, ISP_LOGERR, - "bad hard address %u- resetting to zero", - icbp->icb_hardaddr); - icbp->icb_hardaddr = 0; - } + icbp->icb_hardaddr = 0; + ownloopid = 0; } - - if (isp->isp_confopts & ISP_CFG_OWNLOOPID) { + if (ownloopid) { icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS; } @@ -2280,7 +2266,6 @@ isp_port_login(ispsoftc_t *isp, uint16_t handle, uint32_t portid) "isp_plogi_old: portid 0x%06x already logged in as %u", portid, mbs.param[1]); return (MBOX_PORT_ID_USED | (mbs.param[1] << 16)); - break; case MBOX_LOOP_ID_USED: isp_prt(isp, ISP_LOGDEBUG0, @@ -2963,19 +2948,17 @@ isp_scan_loop(ispsoftc_t *isp) /* * Check to make sure it's still a valid entry. The 24XX seems * to return a portid but not a WWPN/WWNN or role for devices - * which shift on a loop, or have a WWPN/WWNN but no portid. + * which shift on a loop. */ if (tmp.node_wwn == 0 || tmp.port_wwn == 0 || tmp.portid == 0) { - if (isp->isp_dblev & ISP_LOGSANCFG) { - int a, b, c; - a = !(tmp.node_wwn == 0); - b = !(tmp.port_wwn == 0); - c = !(tmp.portid == 0); - isp_prt(isp, ISP_LOGALL, - "bad pdb (%1d%1d%1d) @ handle 0x%x", - a, b, c, handle); - isp_dump_portdb(isp); - } + int a, b, c; + a = (tmp.node_wwn == 0); + b = (tmp.port_wwn == 0); + c = (tmp.portid == 0); + isp_prt(isp, ISP_LOGWARN, + "bad pdb (%1d%1d%1d) @ handle 0x%x", a, b, c, + handle); + isp_dump_portdb(isp); continue; } @@ -4576,7 +4559,6 @@ isp_intr(ispsoftc_t *isp, uint32_t isr, uint16_t sema, uint16_t mbox) if ((IS_FC(isp) && mbox != ASYNC_RIO_RESP) || isp->isp_state != ISP_RUNSTATE) { goto out; - return; } } @@ -7523,11 +7505,11 @@ isp_rd_2400_nvram(ispsoftc_t *isp, uint32_t addr, uint32_t *rp) for (loops = 0; loops < 5000; loops++) { USEC_DELAY(10); tmp = ISP_READ(isp, BIU2400_FLASH_ADDR); - if ((tmp & (1 << 31)) != 0) { + if ((tmp & (1U << 31)) != 0) { break; } } - if (tmp & (1 << 31)) { + if (tmp & (1U << 31)) { tmp = ISP_READ(isp, BIU2400_FLASH_DATA); *rp = tmp; } else { diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h index 829d8b6f9388..f57644dd0dd3 100644 --- a/sys/dev/isp/ispmbox.h +++ b/sys/dev/isp/ispmbox.h @@ -643,7 +643,7 @@ typedef struct { uint16_t ms_flags; uint16_t ms_reserved1; /* low 8 bits */ uint16_t ms_time; - uint16_t ms_cmd_cnt; /* Command DSD count */; + uint16_t ms_cmd_cnt; /* Command DSD count */ uint16_t ms_tot_cnt; /* Total DSD Count */ uint8_t ms_type; /* MS type */ uint8_t ms_r_ctl; /* R_CTL */ diff --git a/sys/dev/isp/ispreg.h b/sys/dev/isp/ispreg.h index 57b58772b9ab..25ad07a4622a 100644 --- a/sys/dev/isp/ispreg.h +++ b/sys/dev/isp/ispreg.h @@ -409,14 +409,14 @@ /* BIU2400_HCCR definitions */ -#define HCCR_2400_CMD_NOP (0x0 << 28) -#define HCCR_2400_CMD_RESET (0x1 << 28) -#define HCCR_2400_CMD_CLEAR_RESET (0x2 << 28) -#define HCCR_2400_CMD_PAUSE (0x3 << 28) -#define HCCR_2400_CMD_RELEASE (0x4 << 28) -#define HCCR_2400_CMD_SET_HOST_INT (0x5 << 28) -#define HCCR_2400_CMD_CLEAR_HOST_INT (0x6 << 28) -#define HCCR_2400_CMD_CLEAR_RISC_INT (0xA << 28) +#define HCCR_2400_CMD_NOP 0x00000000 +#define HCCR_2400_CMD_RESET 0x10000000 +#define HCCR_2400_CMD_CLEAR_RESET 0x20000000 +#define HCCR_2400_CMD_PAUSE 0x30000000 +#define HCCR_2400_CMD_RELEASE 0x40000000 +#define HCCR_2400_CMD_SET_HOST_INT 0x50000000 +#define HCCR_2400_CMD_CLEAR_HOST_INT 0x60000000 +#define HCCR_2400_CMD_CLEAR_RISC_INT 0xA0000000 #define HCCR_2400_RISC_ERR(x) (((x) >> 12) & 0x7) /* RO */ #define HCCR_2400_RISC2HOST_INT (1 << 6) /* RO */