Deleted Added
full compact
isp_freebsd.c (284748) isp_freebsd.c (285146)
1/*-
2 * Copyright (c) 1997-2009 by Matthew Jacob
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27/*
28 * Platform (FreeBSD) dependent common attachment code for Qlogic adapters.
29 */
30#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1997-2009 by Matthew Jacob
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27/*
28 * Platform (FreeBSD) dependent common attachment code for Qlogic adapters.
29 */
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/dev/isp/isp_freebsd.c 284748 2015-06-24 09:06:12Z mav $");
31__FBSDID("$FreeBSD: head/sys/dev/isp/isp_freebsd.c 285146 2015-07-04 18:38:46Z mav $");
32
33#include <dev/isp/isp_freebsd.h>
34#include <sys/unistd.h>
35#include <sys/kthread.h>
36#include <sys/conf.h>
37#include <sys/module.h>
38#include <sys/ioccom.h>
39#include <dev/isp/isp_ioctl.h>

--- 70 unchanged lines hidden (view full) ---

110
111 /* We don't allow target mode switch from here. */
112 if ((value ^ old) & ISP_ROLE_TARGET) {
113 ISP_UNLOCK(isp);
114 return (EPERM);
115 }
116
117 /* Actually change the role. */
32
33#include <dev/isp/isp_freebsd.h>
34#include <sys/unistd.h>
35#include <sys/kthread.h>
36#include <sys/conf.h>
37#include <sys/module.h>
38#include <sys/ioccom.h>
39#include <dev/isp/isp_ioctl.h>

--- 70 unchanged lines hidden (view full) ---

110
111 /* We don't allow target mode switch from here. */
112 if ((value ^ old) & ISP_ROLE_TARGET) {
113 ISP_UNLOCK(isp);
114 return (EPERM);
115 }
116
117 /* Actually change the role. */
118 error = isp_fc_change_role(isp, chan, value);
118 error = isp_control(isp, ISPCTL_CHANGE_ROLE, chan, value);
119 ISP_UNLOCK(isp);
120 return (error);
121}
122
123static int
124isp_attach_chan(ispsoftc_t *isp, struct cam_devq *devq, int chan)
125{
126 struct ccb_setasync csa;

--- 342 unchanged lines hidden (view full) ---

469 * We should, but a bunch of things are currently broken,
470 * so don't allow it.
471 */
472 if (nr == ISP_ROLE_BOTH) {
473 isp_prt(isp, ISP_LOGERR, "cannot support dual role at present");
474 retval = EINVAL;
475 break;
476 }
119 ISP_UNLOCK(isp);
120 return (error);
121}
122
123static int
124isp_attach_chan(ispsoftc_t *isp, struct cam_devq *devq, int chan)
125{
126 struct ccb_setasync csa;

--- 342 unchanged lines hidden (view full) ---

469 * We should, but a bunch of things are currently broken,
470 * so don't allow it.
471 */
472 if (nr == ISP_ROLE_BOTH) {
473 isp_prt(isp, ISP_LOGERR, "cannot support dual role at present");
474 retval = EINVAL;
475 break;
476 }
477 *(int *)addr = FCPARAM(isp, chan)->role;
478#ifdef ISP_INTERNAL_TARGET
479 ISP_LOCK(isp);
477 ISP_LOCK(isp);
480 retval = isp_fc_change_role(isp, chan, nr);
481 ISP_UNLOCK(isp);
482#else
483 FCPARAM(isp, chan)->role = nr;
484#endif
478 *(int *)addr = FCPARAM(isp, chan)->role;
485 } else {
479 } else {
480 ISP_LOCK(isp);
486 *(int *)addr = SDPARAM(isp, chan)->role;
481 *(int *)addr = SDPARAM(isp, chan)->role;
487 SDPARAM(isp, chan)->role = nr;
488 }
482 }
483 retval = isp_control(isp, ISPCTL_CHANGE_ROLE, chan, nr);
484 ISP_UNLOCK(isp);
489 retval = 0;
490 break;
491
492 case ISP_RESETHBA:
493 ISP_LOCK(isp);
494#ifdef ISP_TARGET_MODE
495 isp_del_all_wwn_entries(isp, ISP_NOCHAN);
496#endif

--- 4976 unchanged lines hidden (view full) ---

5473 break;
5474 }
5475 if (rchange) {
5476 ISP_PATH_PRT(isp, ISP_LOGCONFIG, ccb->ccb_h.path, "changing role on from %d to %d\n", fcp->role, newrole);
5477#ifdef ISP_TARGET_MODE
5478 ISP_SET_PC(isp, bus, tm_enabled, 0);
5479 ISP_SET_PC(isp, bus, tm_luns_enabled, 0);
5480#endif
485 retval = 0;
486 break;
487
488 case ISP_RESETHBA:
489 ISP_LOCK(isp);
490#ifdef ISP_TARGET_MODE
491 isp_del_all_wwn_entries(isp, ISP_NOCHAN);
492#endif

--- 4976 unchanged lines hidden (view full) ---

5469 break;
5470 }
5471 if (rchange) {
5472 ISP_PATH_PRT(isp, ISP_LOGCONFIG, ccb->ccb_h.path, "changing role on from %d to %d\n", fcp->role, newrole);
5473#ifdef ISP_TARGET_MODE
5474 ISP_SET_PC(isp, bus, tm_enabled, 0);
5475 ISP_SET_PC(isp, bus, tm_luns_enabled, 0);
5476#endif
5481 if (isp_fc_change_role(isp, bus, newrole) != 0) {
5477 if (isp_control(isp, ISPCTL_CHANGE_ROLE,
5478 bus, newrole) != 0) {
5482 ccb->ccb_h.status = CAM_REQ_CMP_ERR;
5483 xpt_done(ccb);
5484 break;
5485 }
5486#ifdef ISP_TARGET_MODE
5487 if (newrole == ISP_ROLE_TARGET || newrole == ISP_ROLE_BOTH) {
5488 /*
5489 * Give the new role a chance to complain and settle

--- 173 unchanged lines hidden (view full) ---

5663 isp_free_pcmd(isp, (union ccb *) sccb);
5664 }
5665 xpt_done((union ccb *) sccb);
5666}
5667
5668void
5669isp_async(ispsoftc_t *isp, ispasync_t cmd, ...)
5670{
5479 ccb->ccb_h.status = CAM_REQ_CMP_ERR;
5480 xpt_done(ccb);
5481 break;
5482 }
5483#ifdef ISP_TARGET_MODE
5484 if (newrole == ISP_ROLE_TARGET || newrole == ISP_ROLE_BOTH) {
5485 /*
5486 * Give the new role a chance to complain and settle

--- 173 unchanged lines hidden (view full) ---

5660 isp_free_pcmd(isp, (union ccb *) sccb);
5661 }
5662 xpt_done((union ccb *) sccb);
5663}
5664
5665void
5666isp_async(ispsoftc_t *isp, ispasync_t cmd, ...)
5667{
5671 int bus;
5668 int bus, now;
5672 static const char prom0[] = "Chan %d PortID 0x%06x handle 0x%x %s %s WWPN 0x%08x%08x";
5673 static const char prom2[] = "Chan %d PortID 0x%06x handle 0x%x %s %s tgt %u WWPN 0x%08x%08x";
5674 char buf[64];
5675 char *msg = NULL;
5676 target_id_t tgt;
5677 fcportdb_t *lp;
5678 struct isp_fc *fc;
5679 struct cam_path *tmppath;

--- 224 unchanged lines hidden (view full) ---

5904 isp_prt(isp, ISP_LOGCONFIG, prom0, bus, lp->portid, lp->handle, buf, "stayed",
5905 (uint32_t) (lp->port_wwn >> 32), (uint32_t) lp->port_wwn);
5906 }
5907 break;
5908 case ISPASYNC_DEV_GONE:
5909 va_start(ap, cmd);
5910 bus = va_arg(ap, int);
5911 lp = va_arg(ap, fcportdb_t *);
5669 static const char prom0[] = "Chan %d PortID 0x%06x handle 0x%x %s %s WWPN 0x%08x%08x";
5670 static const char prom2[] = "Chan %d PortID 0x%06x handle 0x%x %s %s tgt %u WWPN 0x%08x%08x";
5671 char buf[64];
5672 char *msg = NULL;
5673 target_id_t tgt;
5674 fcportdb_t *lp;
5675 struct isp_fc *fc;
5676 struct cam_path *tmppath;

--- 224 unchanged lines hidden (view full) ---

5901 isp_prt(isp, ISP_LOGCONFIG, prom0, bus, lp->portid, lp->handle, buf, "stayed",
5902 (uint32_t) (lp->port_wwn >> 32), (uint32_t) lp->port_wwn);
5903 }
5904 break;
5905 case ISPASYNC_DEV_GONE:
5906 va_start(ap, cmd);
5907 bus = va_arg(ap, int);
5908 lp = va_arg(ap, fcportdb_t *);
5909 now = va_arg(ap, int);
5912 va_end(ap);
5913 fc = ISP_FC_PC(isp, bus);
5914 /*
5915 * If this has a virtual target and we haven't marked it
5916 * that we're going to have isp_gdt tell the OS it's gone,
5917 * set the isp_gdt timer running on it.
5918 *
5919 * If it isn't marked that isp_gdt is going to get rid of it,
5920 * announce that it's gone.
5921 *
5922 */
5923 isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
5910 va_end(ap);
5911 fc = ISP_FC_PC(isp, bus);
5912 /*
5913 * If this has a virtual target and we haven't marked it
5914 * that we're going to have isp_gdt tell the OS it's gone,
5915 * set the isp_gdt timer running on it.
5916 *
5917 * If it isn't marked that isp_gdt is going to get rid of it,
5918 * announce that it's gone.
5919 *
5920 */
5921 isp_gen_role_str(buf, sizeof (buf), lp->prli_word3);
5924 if (lp->dev_map_idx && lp->announced == 0) {
5922 if (lp->dev_map_idx && lp->announced == 0 && now) {
5925 lp->announced = 1;
5923 lp->announced = 1;
5924 tgt = lp->dev_map_idx - 1;
5925 FCPARAM(isp, bus)->isp_dev_map[tgt] = 0;
5926 lp->dev_map_idx = 0;
5927 isp_make_gone(isp, lp, bus, tgt);
5928 isp_prt(isp, ISP_LOGCONFIG, prom2, bus, lp->portid, lp->handle, buf, "gone at", tgt, (uint32_t) (lp->port_wwn >> 32), (uint32_t) lp->port_wwn);
5929 isp_fcp_reset_crn(fc, tgt, /*tgt_set*/ 1);
5930 } else if (lp->dev_map_idx && lp->announced == 0) {
5931 lp->announced = 1;
5926 lp->state = FC_PORTDB_STATE_ZOMBIE;
5927 lp->gone_timer = ISP_FC_PC(isp, bus)->gone_device_time;
5928 if (fc->ready && !callout_active(&fc->gdt)) {
5929 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGDEBUG0, "Chan %d Starting Gone Device Timer with %u seconds time now %lu", bus, lp->gone_timer, (unsigned long)time_uptime);
5930 callout_reset(&fc->gdt, hz, isp_gdt, fc);
5931 }
5932 tgt = lp->dev_map_idx - 1;
5933 isp_prt(isp, ISP_LOGCONFIG, prom2, bus, lp->portid, lp->handle, buf, "gone zombie at", tgt, (uint32_t) (lp->port_wwn >> 32), (uint32_t) lp->port_wwn);

--- 654 unchanged lines hidden ---
5932 lp->state = FC_PORTDB_STATE_ZOMBIE;
5933 lp->gone_timer = ISP_FC_PC(isp, bus)->gone_device_time;
5934 if (fc->ready && !callout_active(&fc->gdt)) {
5935 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGDEBUG0, "Chan %d Starting Gone Device Timer with %u seconds time now %lu", bus, lp->gone_timer, (unsigned long)time_uptime);
5936 callout_reset(&fc->gdt, hz, isp_gdt, fc);
5937 }
5938 tgt = lp->dev_map_idx - 1;
5939 isp_prt(isp, ISP_LOGCONFIG, prom2, bus, lp->portid, lp->handle, buf, "gone zombie at", tgt, (uint32_t) (lp->port_wwn >> 32), (uint32_t) lp->port_wwn);

--- 654 unchanged lines hidden ---