Hello community,
here is the log from the commit of package fnic-kmp for openSUSE:Factory
checked in at Fri Dec 5 15:20:01 CET 2008.
--------
--- fnic-kmp/fnic-kmp.changes 2008-12-04 17:03:37.000000000 +0100
+++ /mounts/work_src_done/STABLE/fnic-kmp/fnic-kmp.changes 2008-12-05 11:52:45.817239000 +0100
@@ -1,0 +2,19 @@
+Fri Dec 5 11:45:51 CET 2008 - kkeil@suse.de
+
+- update to last version from Cisco
+ * Add fc_function_template attributes
+ * set rport dev_loss_tmo based on configured fnic
+ port_down_timeout value
+ * Fix fnic reset
+ * Free exch manager after detaching from scsi and fc_transport
+ * Reserve some bits for future use, so reduce mask width
+ * Use link down count provided by fw to detect any missed link
+ down events
+ * After scsi_host reset, wait for a while before returning
+ SUCCESS to scsi
+ * Fix comment, legacy pba is now read, not read to clear
+ * Remove some bug_ons
+ * Add compile and run time flags to control debug prints
+ * Set host_maxframe_size and supported_speeds attributes
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
fnic_01.patch
fnic_02.patch
fnic_03.patch
fnic_04.patch
fnic_05.patch
fnic_06.patch
fnic_07.patch
fnic_08.patch
fnic_09.patch
fnic_10.patch
fnic_11.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ fnic-kmp.spec ++++++
--- /var/tmp/diff_new_pack.A16138/_old 2008-12-05 15:16:16.000000000 +0100
+++ /var/tmp/diff_new_pack.A16138/_new 2008-12-05 15:16:16.000000000 +0100
@@ -25,10 +25,21 @@
AutoReqProv: on
Summary: The Cisco 10 fiberchannel over ethernet driver
Version: 1.0.0
-Release: 3
+Release: 4
Source: fnic-%{version}.tar.bz2
Source1: Module.supported
-Patch0: fnic.patch
+Patch1: fnic_01.patch
+Patch2: fnic_02.patch
+Patch3: fnic_03.patch
+Patch4: fnic_04.patch
+Patch5: fnic_05.patch
+Patch6: fnic_06.patch
+Patch7: fnic_07.patch
+Patch8: fnic_08.patch
+Patch9: fnic_09.patch
+Patch10: fnic_10.patch
+Patch11: fnic_11.patch
+Patch99: fnic.patch
License: GPL v2 only
BuildRoot: %{_tmppath}/%{name}-%{version}-build
ExclusiveArch: %ix86 ia64 ppc ppc64 x86_64
@@ -67,7 +78,18 @@
%prep
%setup -n fnic
-%patch0 -p1
+%patch1 -p4
+%patch2 -p4
+%patch3 -p4
+%patch4 -p4
+%patch5 -p4
+%patch6 -p4
+%patch7 -p4
+%patch8 -p4
+%patch9 -p4
+%patch10 -p4
+%patch11 -p4
+%patch99 -p1
%build
echo "flavors_to_build: %{flavors_to_build}"
@@ -91,6 +113,22 @@
done
%changelog
+* Fri Dec 05 2008 kkeil@suse.de
+- update to last version from Cisco
+ * Add fc_function_template attributes
+ * set rport dev_loss_tmo based on configured fnic
+ port_down_timeout value
+ * Fix fnic reset
+ * Free exch manager after detaching from scsi and fc_transport
+ * Reserve some bits for future use, so reduce mask width
+ * Use link down count provided by fw to detect any missed link
+ down events
+ * After scsi_host reset, wait for a while before returning
+ SUCCESS to scsi
+ * Fix comment, legacy pba is now read, not read to clear
+ * Remove some bug_ons
+ * Add compile and run time flags to control debug prints
+ * Set host_maxframe_size and supported_speeds attributes
* Thu Dec 04 2008 kkeil@suse.de
- remove obsolete backport patches
* Tue Dec 02 2008 kkeil@suse.de
++++++ fnic_01.patch ++++++
fnic: Add fc_function_template attributes
Add host_port_state callbacks, show dev_loss_tmo
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic_main.c | 7 +++----
1 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 67f70af..25843cf 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -123,21 +123,20 @@ static struct fc_function_template fnic_fc_functions = {
.show_host_supported_classes = 1,
.show_host_supported_fc4s = 1,
.show_host_active_fc4s = 1,
-
.show_host_port_id = 1,
.get_host_speed = fnic_get_host_speed,
.show_host_speed = 1,
.show_host_port_type = 1,
+ .get_host_port_state = fc_get_host_port_state,
+ .show_host_port_state = 1,
.show_host_symbolic_name = 1,
-
.show_rport_maxframe_size = 1,
.show_rport_supported_classes = 1,
-
.show_host_fabric_name = 1,
.show_starget_node_name = 1,
.show_starget_port_name = 1,
.show_starget_port_id = 1,
-
+ .show_rport_dev_loss_tmo = 1,
.issue_fc_host_lip = fnic_reset,
.get_fc_host_stats = fnic_get_stats,
.dd_fcrport_size = sizeof(struct fc_rport_libfc_priv),
++++++ fnic_02.patch ++++++
fnic: set rport dev_loss_tmo based on configured fnic port_down_timeout value
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic_main.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 25843cf..84c43b1 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -82,6 +82,8 @@ static struct libfc_function_template fnic_transport_template = {
static int fnic_slave_alloc(struct scsi_device *sdev)
{
struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
+ struct fc_lport *lp = shost_priv(sdev->host);
+ struct fnic *fnic = lport_priv(lp);
sdev->tagged_supported = 1;
@@ -89,6 +91,7 @@ static int fnic_slave_alloc(struct scsi_device *sdev)
return -ENXIO;
scsi_activate_tcq(sdev, FNIC_DFLT_QUEUE_DEPTH);
+ rport->dev_loss_tmo = fnic->config.port_down_timeout / 1000;
return 0;
}
++++++ fnic_03.patch ++++++
fnic: Fix fnic reset
fnic_reset is callback that is mapped to issue_host_lip_reset. It should first
call fc_lport_reset to reset the local port. This will block all remote ports,
and block SCSI from sending more IOs. Then since link is up, libFC will call
back into fnic driver with Flogi Frame. The Flogi frame causes reset of all
IOs (reset of fnic exchanges) and completions to SCSI after reset completes.
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic_scsi.c | 34 +---------------------------------
1 files changed, 1 insertions(+), 33 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
index 47d8565..9486d7b 100644
--- a/drivers/scsi/fnic/fnic_scsi.c
+++ b/drivers/scsi/fnic/fnic_scsi.c
@@ -1481,51 +1481,19 @@ int fnic_reset(struct Scsi_Host *shost)
{
struct fc_lport *lp;
struct fnic *fnic;
- unsigned long flags;
int ret = SUCCESS;
- enum fnic_state old_state;
- DECLARE_COMPLETION_ONSTACK(reset_wait);
lp = shost_priv(shost);
fnic = lport_priv(lp);
printk(KERN_DEBUG DFX "fnic_reset called\n", fnic->fnic_no);
- /* Issue firmware reset */
- spin_lock_irqsave(&fnic->fnic_lock, flags);
- fnic->reset_wait = &reset_wait;
- old_state = fnic->state;
- fnic->state = FNIC_IN_FC_TRANS_ETH_MODE;
- vnic_dev_del_addr(fnic->vdev, fnic->data_src_addr);
- spin_unlock_irqrestore(&fnic->fnic_lock, flags);
-
- if (fnic_fw_reset_handler(fnic)) {
- spin_lock_irqsave(&fnic->fnic_lock, flags);
- ret = FAILED;
- if (fnic->state == FNIC_IN_FC_TRANS_ETH_MODE)
- fnic->state = old_state;
- fnic->reset_wait = NULL;
- spin_unlock_irqrestore(&fnic->fnic_lock, flags);
- goto fnic_reset_end;
- }
-
- /* fw reset is issued, now wait for it to complete */
- wait_for_completion_timeout(&reset_wait,
- msecs_to_jiffies(FNIC_HOST_RESET_TIMEOUT));
-
- /* Check for status */
- spin_lock_irqsave(&fnic->fnic_lock, flags);
- fnic->reset_wait = NULL;
- ret = (fnic->state == FNIC_IN_ETH_MODE) ? SUCCESS : FAILED;
- spin_unlock_irqrestore(&fnic->fnic_lock, flags);
-
- /* Now reset local port, this will clean up libFC exchanges,
+ /* Reset local port, this will clean up libFC exchanges,
* reset remote port sessions, and if link is up, begin flogi
*/
if (lp->tt.lport_reset(lp))
ret = FAILED;
-fnic_reset_end:
printk(KERN_DEBUG DFX "Returning from fnic reset %s\n",
fnic->fnic_no, (ret == SUCCESS) ? "SUCCESS" : "FAILED");
++++++ fnic_04.patch ++++++
fnic: Free exch manager after detaching from scsi and fc_transport
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic_main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 84c43b1..0d5e4f5 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -805,10 +805,10 @@ static void __devexit fnic_remove(struct pci_dev *pdev)
struct fnic *fnic = pci_get_drvdata(pdev);
fc_lport_destroy(fnic->lport);
- fc_exch_mgr_free(fnic->lport->emp);
fnic_cleanup(fnic);
fc_remove_host(fnic->lport->host);
scsi_remove_host(fnic->lport->host);
+ fc_exch_mgr_free(fnic->lport->emp);
vnic_dev_notify_unset(fnic->vdev);
fnic_free_vnic_resources(fnic);
fnic_free_intr(fnic);
++++++ fnic_05.patch ++++++
fnic: Reserve some bits for future use, so reduce mask width
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/cq_desc.h | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/fnic/cq_desc.h b/drivers/scsi/fnic/cq_desc.h
index c601cb8..d1225cf 100644
--- a/drivers/scsi/fnic/cq_desc.h
+++ b/drivers/scsi/fnic/cq_desc.h
@@ -42,9 +42,10 @@ struct cq_desc {
u8 type_color;
};
-#define CQ_DESC_TYPE_BITS 7
+#define CQ_DESC_TYPE_BITS 4
#define CQ_DESC_TYPE_MASK ((1 << CQ_DESC_TYPE_BITS) - 1)
#define CQ_DESC_COLOR_MASK 1
+#define CQ_DESC_COLOR_SHIFT 7
#define CQ_DESC_Q_NUM_BITS 10
#define CQ_DESC_Q_NUM_MASK ((1 << CQ_DESC_Q_NUM_BITS) - 1)
#define CQ_DESC_COMP_NDX_BITS 12
@@ -56,7 +57,7 @@ static inline void cq_desc_dec(const struct cq_desc *desc_arg,
const struct cq_desc *desc = desc_arg;
const u8 type_color = desc->type_color;
- *color = (type_color >> CQ_DESC_TYPE_BITS) & CQ_DESC_COLOR_MASK;
+ *color = (type_color >> CQ_DESC_COLOR_SHIFT) & CQ_DESC_COLOR_MASK;
/*
* Make sure color bit is read from desc *before* other fields
++++++ fnic_06.patch ++++++
fnic: Use link down count provided by fw to detect any missed link down events
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic.h | 7 +++
drivers/scsi/fnic/fnic_main.c | 88 ++++++++++++++++++++++++++++++++-------
drivers/scsi/fnic/vnic_dev.c | 8 ++++
drivers/scsi/fnic/vnic_dev.h | 1
drivers/scsi/fnic/vnic_devcmd.h | 1
5 files changed, 89 insertions(+), 16 deletions(-)
diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
index 7e0a640..a2eedb3 100644
--- a/drivers/scsi/fnic/fnic.h
+++ b/drivers/scsi/fnic/fnic.h
@@ -114,6 +114,11 @@ enum fnic_state {
#define FNIC_RQ_MAX 1
#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
+enum fnic_link_state {
+ FNIC_LINK_DOWN = 0,
+ FNIC_LINK_UP
+};
+
/* Per-instance private data structure */
struct fnic {
struct fc_lport *lport;
@@ -144,6 +149,8 @@ struct fnic {
struct fc_frame *flogi;
struct fc_frame *flogi_resp;
+ enum fnic_link_state link_state;
+ u32 link_down_cnt;
u16 flogi_oxid;
unsigned long s_id;
enum fnic_state state;
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 0d5e4f5..a4976b6 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -236,36 +236,90 @@ void fnic_log_q_error(struct fnic *fnic)
static void fnic_handle_link_event(struct fnic *fnic)
{
int link_status = vnic_dev_link_status(fnic->vdev);
+ u32 link_down_cnt = vnic_dev_link_down_cnt(fnic->vdev);
struct fnic_event *event;
- u8 list_was_empty;
+ u8 list_was_empty = 0;
unsigned long flags;
+ u8 send_link_up = 0;
+ u8 send_link_down = 0;
printk(KERN_DEBUG DFX "link %s\n", fnic->fnic_no,
(link_status ? "up" : "down"));
- if (fnic->in_remove)
+ spin_lock_irqsave(&fnic->fnic_lock, flags);
+ if (fnic->in_remove) {
+ fnic->link_down_cnt = link_down_cnt;
+ spin_unlock_irqrestore(&fnic->fnic_lock, flags);
return;
+ }
- event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
- if (!event) {
- printk(KERN_DEBUG DFX "Cannot allocate a event, "
- "cannot indicate link down to FCS\n", fnic->fnic_no);
- return;
+ /*
+ * If link was down, and down event, do nothing
+ * If link was down, and up event, send up event
+ * if link was up, and down event, send down event
+ * If link was up, and up event, and link down cnt matches, do nothing
+ * If link was up, and up event, and link down cnt does not match,
+ * send down followed by up
+ */
+ if (fnic->link_state == FNIC_LINK_DOWN) {
+ if (!link_status) {
+ fnic->link_down_cnt = link_down_cnt;
+ spin_unlock_irqrestore(&fnic->fnic_lock, flags);
+ return;
+ } else
+ send_link_up = 1;
+ } else {
+ if (!link_status) {
+ send_link_down = 1;
+ } else if (link_down_cnt != fnic->link_down_cnt) {
+ send_link_down = 1;
+ send_link_up = 1;
+ } else {
+ fnic->link_down_cnt = link_down_cnt;
+ spin_unlock_irqrestore(&fnic->fnic_lock, flags);
+ return;
+ }
}
+ fnic->link_down_cnt = link_down_cnt;
+ spin_unlock_irqrestore(&fnic->fnic_lock, flags);
- /* Pass the event to thread */
- memset(event, 0, sizeof(struct fnic_event));
- event->fnic = fnic;
- event->ev_type = EV_TYPE_LINK_UP;
- if (!link_status) {
+ if (send_link_down) {
+ event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
+ if (!event) {
+ printk(KERN_DEBUG DFX "Cannot allocate a event, "
+ "cannot indicate link down to FCS\n",
+ fnic->fnic_no);
+ return;
+ }
+ memset(event, 0, sizeof(struct fnic_event));
+ event->fnic = fnic;
event->ev_type = EV_TYPE_LINK_DOWN;
fnic->lport->host_stats.link_failure_count++;
+
+ spin_lock_irqsave(&fnic_eventlist_lock, flags);
+ list_was_empty = list_empty(&fnic_eventlist);
+ list_add_tail(&event->list, &fnic_eventlist);
+ spin_unlock_irqrestore(&fnic_eventlist_lock, flags);
+ }
+
+ if (send_link_up) {
+ event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
+ if (!event) {
+ printk(KERN_DEBUG DFX "Cannot allocate a event, "
+ "cannot indicate link up to FCS\n",
+ fnic->fnic_no);
+ return;
+ }
+ memset(event, 0, sizeof(struct fnic_event));
+ event->fnic = fnic;
+ event->ev_type = EV_TYPE_LINK_UP;
+
+ spin_lock_irqsave(&fnic_eventlist_lock, flags);
+ list_was_empty |= list_empty(&fnic_eventlist);
+ list_add_tail(&event->list, &fnic_eventlist);
+ spin_unlock_irqrestore(&fnic_eventlist_lock, flags);
}
- spin_lock_irqsave(&fnic_eventlist_lock, flags);
- list_was_empty = list_empty(&fnic_eventlist);
- list_add_tail(&event->list, &fnic_eventlist);
- spin_unlock_irqrestore(&fnic_eventlist_lock, flags);
if (list_was_empty)
wake_up_process(fnic_thread);
@@ -664,6 +718,8 @@ static int __devinit fnic_probe(struct pci_dev *pdev,
fnic->flogi = NULL;
fnic->flogi_resp = NULL;
fnic->state = FNIC_IN_FC_MODE;
+ fnic->link_state = FNIC_LINK_DOWN;
+ fnic->link_down_cnt = 0;
/* Enable hardware stripping of vlan header on ingress */
fnic_set_nic_cfg(fnic, 0, 0, 0, 0, 0, 0, 1);
diff --git a/drivers/scsi/fnic/vnic_dev.c b/drivers/scsi/fnic/vnic_dev.c
index 8f068f6..37cbd13 100644
--- a/drivers/scsi/fnic/vnic_dev.c
+++ b/drivers/scsi/fnic/vnic_dev.c
@@ -618,6 +618,14 @@ u32 vnic_dev_mtu(struct vnic_dev *vdev)
return vdev->notify_copy.mtu;
}
+u32 vnic_dev_link_down_cnt(struct vnic_dev *vdev)
+{
+ if (!vnic_dev_notify_ready(vdev))
+ return 0;
+
+ return vdev->notify_copy.link_down_cnt;
+}
+
void vnic_dev_set_intr_mode(struct vnic_dev *vdev,
enum vnic_dev_intr_mode intr_mode)
{
diff --git a/drivers/scsi/fnic/vnic_dev.h b/drivers/scsi/fnic/vnic_dev.h
index 4d23a15..3ad9ac9 100644
--- a/drivers/scsi/fnic/vnic_dev.h
+++ b/drivers/scsi/fnic/vnic_dev.h
@@ -87,6 +87,7 @@ int vnic_dev_link_status(struct vnic_dev *vdev);
u32 vnic_dev_port_speed(struct vnic_dev *vdev);
u32 vnic_dev_msg_lvl(struct vnic_dev *vdev);
u32 vnic_dev_mtu(struct vnic_dev *vdev);
+u32 vnic_dev_link_down_cnt(struct vnic_dev *vdev);
int vnic_dev_close(struct vnic_dev *vdev);
int vnic_dev_enable(struct vnic_dev *vdev);
int vnic_dev_disable(struct vnic_dev *vdev);
diff --git a/drivers/scsi/fnic/vnic_devcmd.h b/drivers/scsi/fnic/vnic_devcmd.h
index f60003d..d62b906 100644
--- a/drivers/scsi/fnic/vnic_devcmd.h
+++ b/drivers/scsi/fnic/vnic_devcmd.h
@@ -247,6 +247,7 @@ struct vnic_devcmd_notify {
u32 uif; /* uplink interface */
u32 status; /* status bits (see VNIC_STF_*) */
u32 error; /* error code (see ERR_*) for first ERR */
+ u32 link_down_cnt; /* running count of link down transitions */
};
#define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */
++++++ fnic_07.patch ++++++
fnic: After scsi_host reset, wait for a while before returning SUCCESS to scsi
During scsi eh, if lport reset succeeds, it starts off the fabric login.
Wait for fabric login to complete for HOST_RESET_SETTLE_TIME. After that
if local port is not up, then fail the host_reset.
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic.h | 2 +-
drivers/scsi/fnic/fnic_scsi.c | 20 +++++++++++++++++---
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
index a2eedb3..6381d9d 100644
--- a/drivers/scsi/fnic/fnic.h
+++ b/drivers/scsi/fnic/fnic.h
@@ -72,7 +72,7 @@
#define FNIC_LUN_RESET_TIMEOUT 10000 /* mSec */
#define FNIC_HOST_RESET_TIMEOUT 10000 /* mSec */
#define FNIC_RMDEVICE_TIMEOUT 1000 /* mSec */
-#define FNIC_HOST_RESET_SETTLE_TIME 10 /* Sec */
+#define FNIC_HOST_RESET_SETTLE_TIME 30 /* Sec */
#define FNIC_MAX_LUN 1023
#define FNIC_MAX_FCP_TARGET 256
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
index 9486d7b..1541aff 100644
--- a/drivers/scsi/fnic/fnic_scsi.c
+++ b/drivers/scsi/fnic/fnic_scsi.c
@@ -1511,15 +1511,29 @@ int fnic_reset(struct Scsi_Host *shost)
int fnic_host_reset(struct scsi_cmnd *sc)
{
int ret;
+ unsigned long wait_host_tmo;
+ struct Scsi_Host *shost = sc->device->host;
+ struct fc_lport *lp = shost_priv(shost);
/*
* If fnic_reset is successful, wait for fabric login to complete
* scsi-ml tries to send a TUR to every device if host reset is
* successful, so before returning to scsi, fabric should be up
*/
- ret = fnic_reset(sc->device->host);
- if (ret == SUCCESS)
- ssleep(FNIC_HOST_RESET_SETTLE_TIME);
+ ret = fnic_reset(shost);
+
+ if (ret == SUCCESS) {
+ wait_host_tmo = jiffies + FNIC_HOST_RESET_SETTLE_TIME * HZ;
+ ret = FAILED;
+ while (time_before(jiffies, wait_host_tmo)) {
+ if ((lp->state == LPORT_ST_READY) &&
+ (lp->link_status & FC_LINK_UP)) {
+ ret = SUCCESS;
+ break;
+ }
+ ssleep(1);
+ }
+ }
return ret;
}
++++++ fnic_08.patch ++++++
fnic: Fix comment, legacy pba is now read, not read to clear
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/vnic_intr.h | 2 +-
drivers/scsi/fnic/vnic_resource.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/fnic/vnic_intr.h b/drivers/scsi/fnic/vnic_intr.h
index 3925f28..b53ef8b 100644
--- a/drivers/scsi/fnic/vnic_intr.h
+++ b/drivers/scsi/fnic/vnic_intr.h
@@ -75,7 +75,7 @@ static inline void vnic_intr_return_credits(struct vnic_intr *intr,
static inline u32 vnic_intr_legacy_pba(u32 __iomem *legacy_pba)
{
- /* get and ack interrupt in one read (clear-and-ack-on-read) */
+ /* read PBA without clearing */
return ioread32(legacy_pba);
}
diff --git a/drivers/scsi/fnic/vnic_resource.h b/drivers/scsi/fnic/vnic_resource.h
index 8fc27f3..2d842f7 100644
--- a/drivers/scsi/fnic/vnic_resource.h
+++ b/drivers/scsi/fnic/vnic_resource.h
@@ -36,7 +36,7 @@ enum vnic_res_type {
RES_TYPE_INTR_CTRL, /* Interrupt ctrl table */
RES_TYPE_INTR_TABLE, /* MSI/MSI-X Interrupt table */
RES_TYPE_INTR_PBA, /* MSI/MSI-X PBA table */
- RES_TYPE_INTR_PBA_LEGACY, /* Legacy intr status, r2c */
+ RES_TYPE_INTR_PBA_LEGACY, /* Legacy intr status */
RES_TYPE_RSVD6,
RES_TYPE_RSVD7,
RES_TYPE_DEVCMD, /* Device command region */
++++++ fnic_09.patch ++++++
fnic: Remove some bug_ons
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic_main.c | 2 --
drivers/scsi/fnic/fnic_scsi.c | 4 ----
drivers/scsi/fnic/vnic_wq_copy.h | 4 ----
3 files changed, 0 insertions(+), 10 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index a4976b6..919b2e9 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -350,7 +350,6 @@ static int fnic_notify_set(struct fnic *fnic)
" before devcmd notify set %d\n", fnic->fnic_no,
vnic_dev_get_intr_mode(fnic->vdev));
err = -1;
- BUG();
break;
}
@@ -386,7 +385,6 @@ static int fnic_dev_wait(struct vnic_dev *vdev,
int done;
int err;
- BUG_ON(in_interrupt());
err = start(vdev, arg);
if (err)
return err;
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
index 1541aff..5d00ad5 100644
--- a/drivers/scsi/fnic/fnic_scsi.c
+++ b/drivers/scsi/fnic/fnic_scsi.c
@@ -891,7 +891,6 @@ static int fnic_fcpio_cmpl_handler(struct vnic_dev *vdev,
default:
printk(KERN_DEBUG DFX "firmware completion type %d\n",
fnic->fnic_no, desc->hdr.type);
- BUG();
break;
}
@@ -1116,9 +1115,6 @@ int fnic_abort_cmd(struct scsi_cmnd *sc)
goto fnic_abort_cmd_end;
}
- /* The command has to be in pending state */
- BUG_ON(CMD_STATE(sc) != FNIC_IOREQ_CMD_PENDING);
-
/* Command is still pending, need to abort it
* If the firmware completes the command after this point,
* the completion wont be done till mid-layer, since abort
diff --git a/drivers/scsi/fnic/vnic_wq_copy.h b/drivers/scsi/fnic/vnic_wq_copy.h
index 6439210..c292932 100644
--- a/drivers/scsi/fnic/vnic_wq_copy.h
+++ b/drivers/scsi/fnic/vnic_wq_copy.h
@@ -52,7 +52,6 @@ static inline void *vnic_wq_copy_next_desc(struct vnic_wq_copy *wq)
static inline void vnic_wq_copy_post(struct vnic_wq_copy *wq)
{
- BUG_ON(!wq->ring.desc_avail);
((wq->to_use_index + 1) == wq->ring.desc_count) ?
(wq->to_use_index = 0) : (wq->to_use_index++);
@@ -80,7 +79,6 @@ static inline void vnic_wq_copy_desc_process(struct vnic_wq_copy *wq, u16 index)
wq->to_clean_index = ((index + 1) % wq->ring.desc_count);
wq->ring.desc_avail += cnt;
- BUG_ON(wq->ring.desc_avail >= wq->ring.desc_count);
}
static inline void vnic_wq_copy_service(struct vnic_wq_copy *wq,
@@ -98,8 +96,6 @@ static inline void vnic_wq_copy_service(struct vnic_wq_copy *wq,
wq->ring.desc_avail++;
- BUG_ON(wq->ring.desc_avail >= wq->ring.desc_count);
-
curr_index = wq->to_clean_index;
/* increment the to-clean index so that we start
++++++ fnic-1.0.0.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/fnic/fnic_fcs.c new/fnic/fnic_fcs.c
--- old/fnic/fnic_fcs.c 2008-11-20 20:25:12.000000000 +0100
+++ new/fnic/fnic_fcs.c 2008-12-02 18:00:58.000000000 +0100
@@ -81,8 +81,8 @@
kmem_cache_free(fnic_ev_cache, event);
} else { /* no frame enqueued*/
- spin_unlock_irqrestore(&fnic_eventlist_lock, flags);
set_current_state(TASK_INTERRUPTIBLE);
+ spin_unlock_irqrestore(&fnic_eventlist_lock, flags);
schedule();
set_current_state(TASK_RUNNING);
}
@@ -97,7 +97,6 @@
struct fc_frame *fp = (struct fc_frame *)skb;
skb_trim(skb, len);
- fr_hdr(fp) = skb->data;
fr_eof(fp) = eof;
fr_sof(fp) = sof;
}
@@ -137,7 +136,7 @@
ft = (struct fcoe_crc_eof *)(skb->data + len -
transport_len - sizeof(*ft));
fr_eof(fp) = ft->fcoe_eof;
- skb_trim(skb, len - sizeof(*ft));
+ skb_trim(skb, len - transport_len - sizeof(*ft));
return 0;
}
@@ -165,7 +164,7 @@
" matching cached oxid, dropping frame\n");
ret = -1;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
- fc_frame_free(fp);
+ fnic_fc_frame_free_irq(fp);
goto handle_flogi_resp_end;
}
@@ -208,7 +207,7 @@
fnic_state_str[fnic->state]);
ret = -1;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
- fc_frame_free(fp);
+ fnic_fc_frame_free_irq(fp);
goto handle_flogi_resp_end;
}
@@ -216,7 +215,7 @@
/* Drop older cached frame */
if (old_flogi_resp)
- fc_frame_free(old_flogi_resp);
+ fnic_fc_frame_free_irq(old_flogi_resp);
/* send flogi reg request to firmware, this will put the fnic in
* in FC mode
@@ -238,7 +237,7 @@
fnic->state = FNIC_IN_ETH_MODE;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
if (free_fp)
- fc_frame_free(fp);
+ fnic_fc_frame_free_irq(fp);
}
handle_flogi_resp_end:
@@ -385,7 +384,7 @@
wake_up_process(fnic_thread);
return;
drop:
- kfree_skb(skb);
+ dev_kfree_skb_irq(skb);
}
static int fnic_rq_cmpl_handler_cont(struct vnic_dev *vdev,
@@ -459,7 +458,7 @@
pci_unmap_single(fnic->pdev, buf->dma_addr, buf->len,
PCI_DMA_FROMDEVICE);
- fc_frame_free(fp);
+ fnic_fc_frame_free(fp);
buf->os_buf = NULL;
}
@@ -543,7 +542,7 @@
spin_unlock_irqrestore(&fnic->wq_lock[0], flags);
if (ret)
- fc_frame_free(fp);
+ fnic_fc_frame_free_any(fp);
return ret;
}
@@ -563,7 +562,7 @@
struct fc_frame *old_flogi_resp = NULL;
if (fnic->in_remove) {
- fc_frame_free(fp);
+ fnic_fc_frame_free(fp);
ret = -1;
goto fnic_send_end;
}
@@ -595,11 +594,11 @@
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
if (old_flogi) {
- fc_frame_free(old_flogi);
+ fnic_fc_frame_free(old_flogi);
old_flogi = NULL;
}
if (old_flogi_resp) {
- fc_frame_free(old_flogi_resp);
+ fnic_fc_frame_free(old_flogi_resp);
old_flogi_resp = NULL;
}
@@ -611,7 +610,7 @@
if (ret) {
fnic->state = old_state;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
- fc_frame_free(fp);
+ fnic_fc_frame_free(fp);
goto fnic_send_end;
}
old_flogi = fnic->flogi;
@@ -652,9 +651,9 @@
fnic_send_end:
if (old_flogi)
- fc_frame_free(old_flogi);
+ fnic_fc_frame_free(old_flogi);
if (old_flogi_resp)
- fc_frame_free(old_flogi_resp);
+ fnic_fc_frame_free(old_flogi_resp);
return ret;
}
@@ -662,12 +661,13 @@
struct cq_desc *cq_desc,
struct vnic_wq_buf *buf, void *opaque)
{
- struct fc_frame *fp = buf->os_buf;
+ struct sk_buff *skb = buf->os_buf;
+ struct fc_frame *fp = (struct fc_frame *)skb;
struct fnic *fnic = vnic_dev_priv(wq->vdev);
pci_unmap_single(fnic->pdev, buf->dma_addr,
buf->len, PCI_DMA_TODEVICE);
- fc_frame_free(fp);
+ fnic_fc_frame_free_irq(fp);
buf->os_buf = NULL;
}
@@ -711,6 +711,6 @@
pci_unmap_single(fnic->pdev, buf->dma_addr,
buf->len, PCI_DMA_TODEVICE);
- fc_frame_free(fp);
+ fnic_fc_frame_free(fp);
buf->os_buf = NULL;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/fnic/fnic.h new/fnic/fnic.h
--- old/fnic/fnic.h 2008-11-20 20:25:12.000000000 +0100
+++ new/fnic/fnic.h 2008-12-02 18:00:58.000000000 +0100
@@ -20,6 +20,7 @@
#include
#include
+#include
#include
#include
#include
@@ -210,6 +211,21 @@
u32 is_flogi_resp_frame:1;
};
+static inline void fnic_fc_frame_free_irq(struct fc_frame *fp)
+{
+ dev_kfree_skb_irq(fp_skb(fp));
+}
+
+static inline void fnic_fc_frame_free(struct fc_frame *fp)
+{
+ dev_kfree_skb(fp_skb(fp));
+}
+
+static inline void fnic_fc_frame_free_any(struct fc_frame *fp)
+{
+ dev_kfree_skb_any(fp_skb(fp));
+}
+
/* Fnic Thread for handling FCS Rx Frames*/
extern struct task_struct *fnic_thread;
extern struct list_head fnic_eventlist;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/fnic/fnic_main.c new/fnic/fnic_main.c
--- old/fnic/fnic_main.c 2008-11-20 20:25:12.000000000 +0100
+++ new/fnic/fnic_main.c 2008-12-02 18:00:58.000000000 +0100
@@ -424,10 +424,10 @@
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
if (flogi)
- fc_frame_free(flogi);
+ fnic_fc_frame_free(flogi);
if (flogi_resp)
- fc_frame_free(flogi_resp);
+ fnic_fc_frame_free(flogi_resp);
mempool_destroy(fnic->io_req_pool);
for (i = 0; i < FNIC_SGL_NUM_CACHES; i++)
@@ -727,6 +727,7 @@
fc_set_wwpn(lp, fnic->config.port_wwn);
fc_exch_init(lp);
+ fc_elsct_init(lp);
fc_lport_init(lp);
fc_rport_init(lp);
fc_disc_init(lp);
@@ -942,6 +943,8 @@
event = list_first_entry(&fnic_eventlist,
struct fnic_event, list);
list_del(&event->list);
+ if (event->fp)
+ fnic_fc_frame_free(event->fp);
kmem_cache_free(fnic_ev_cache, event);
}
spin_unlock_irqrestore(&fnic_eventlist_lock, flags);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/fnic/fnic_scsi.c new/fnic/fnic_scsi.c
--- old/fnic/fnic_scsi.c 2008-11-20 20:25:12.000000000 +0100
+++ new/fnic/fnic_scsi.c 2008-12-02 18:00:58.000000000 +0100
@@ -489,7 +489,7 @@
fnic->flogi_oxid = FC_XID_UNKNOWN;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
if (flogi)
- fc_frame_free(flogi);
+ fnic_fc_frame_free_irq(flogi);
goto reset_cmpl_handler_end;
}
@@ -553,7 +553,7 @@
event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
if (!event) {
- fc_frame_free(flogi_resp);
+ fnic_fc_frame_free_irq(flogi_resp);
ret = -1;
goto reg_cmpl_handler_end;
}
@@ -576,7 +576,7 @@
wake_up_process(fnic_thread);
} else
if (flogi_resp)
- fc_frame_free(flogi_resp);
+ fnic_fc_frame_free_irq(flogi_resp);
reg_cmpl_handler_end:
return ret;
@@ -953,9 +953,9 @@
mempool_free(io_req, fnic->io_req_pool);
cleanup_scsi_cmd:
- sc->result = DID_NO_CONNECT << 16;
+ sc->result = DID_TRANSPORT_DISRUPTED << 16;
printk(KERN_DEBUG DFX "fnic_cleanup_io:"
- " did_no_connect\n", fnic->fnic_no);
+ " DID_TRANSPORT_DISRUPTED\n", fnic->fnic_no);
/* Complete the command to SCSI */
if (sc->scsi_done)
++++++ fnic_10.patch ++++++
fnic: Add compile and run time flags to control debug prints
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic.h | 10 +++
drivers/scsi/fnic/fnic_fcs.c | 37 +++++++----
drivers/scsi/fnic/fnic_isr.c | 14 +++-
drivers/scsi/fnic/fnic_main.c | 30 ++++++---
drivers/scsi/fnic/fnic_scsi.c | 133 ++++++++++++++++++++++++-----------------
5 files changed, 141 insertions(+), 83 deletions(-)
diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
index 6381d9d..154039e 100644
--- a/drivers/scsi/fnic/fnic.h
+++ b/drivers/scsi/fnic/fnic.h
@@ -41,6 +41,16 @@
#define PFX DRV_NAME ": "
#define DFX DRV_NAME "%d: "
+/* Define FNIC_DEBUG to enable debugging */
+#ifdef FNIC_DEBUG
+#define FNIC_DBG(fmt, args...) \
+ do { \
+ printk(KERN_DEBUG fmt, ##args); \
+ } while (0)
+#else
+#define FNIC_DBG(fmt, args...)
+#endif
+
#define vnic_fc_config vnic_scsi_config
#define DESC_CLEAN_LOW_WATERMARK 8
diff --git a/drivers/scsi/fnic/fnic_fcs.c b/drivers/scsi/fnic/fnic_fcs.c
index 5ec4411..2d6497b 100644
--- a/drivers/scsi/fnic/fnic_fcs.c
+++ b/drivers/scsi/fnic/fnic_fcs.c
@@ -36,6 +36,15 @@
#include "cq_enet_desc.h"
#include "cq_exch_desc.h"
+static int fnic_fcs_debug;
+
+#define FNIC_DEBUG_FCS(fmt...) \
+ do { \
+ if (fnic_fcs_debug) \
+ FNIC_DBG(fmt); \
+ } while (0)
+
+
struct task_struct *fnic_thread;
LIST_HEAD(fnic_eventlist);
spinlock_t fnic_eventlist_lock;
@@ -160,8 +169,9 @@ static inline int fnic_handle_flogi_resp(struct fnic *fnic,
* issued by libFC might have changed the fnic cached oxid
*/
if (fnic->flogi_oxid != ntohs(fh->fh_ox_id)) {
- printk(KERN_DEBUG PFX "Flogi response oxid not"
- " matching cached oxid, dropping frame\n");
+ FNIC_DEBUG_FCS(DFX "Flogi response oxid not"
+ " matching cached oxid, dropping frame"
+ "\n", fnic->fnic_no);
ret = -1;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
fnic_fc_frame_free_irq(fp);
@@ -202,9 +212,9 @@ static inline int fnic_handle_flogi_resp(struct fnic *fnic,
fnic->state = FNIC_IN_ETH_TRANS_FC_MODE;
} else {
- printk(KERN_DEBUG PFX "Unexpected fnic state %s while"
- " processing flogi resp\n",
- fnic_state_str[fnic->state]);
+ FNIC_DEBUG_FCS(DFX "Unexpected fnic state %s while"
+ " processing flogi resp\n", fnic->fnic_no,
+ fnic_state_str[fnic->state]);
ret = -1;
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
fnic_fc_frame_free_irq(fp);
@@ -331,10 +341,11 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
}
if (!fcs_ok || packet_error || !fcoe_fc_crc_ok || fcoe_enc_error) {
- printk(KERN_DEBUG DFX "fnic rq_cmpl fcoe x%x fcsok x%x"
- " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err x%x\n",
- fnic->fnic_no, fcoe, fcs_ok, packet_error,
- fcoe_fc_crc_ok, fcoe_enc_error);
+ FNIC_DEBUG_FCS(DFX "fnic rq_cmpl fcoe x%x fcsok x%x"
+ " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err"
+ "x%x\n",
+ fnic->fnic_no, fcoe, fcs_ok, packet_error,
+ fcoe_fc_crc_ok, fcoe_enc_error);
goto drop;
}
@@ -362,8 +373,8 @@ static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
/* Queue the frame for receive thread */
event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
if (event == NULL) {
- printk(KERN_DEBUG DFX "Cannot allocate a event, "
- "dropping the FCS Rx frame\n", fnic->fnic_no);
+ FNIC_DEBUG_FCS(DFX "Cannot allocate a event, "
+ "dropping the FCS Rx frame\n", fnic->fnic_no);
goto drop;
}
@@ -437,8 +448,8 @@ int fnic_alloc_rq_frame(struct vnic_rq *rq)
len = FC_FRAME_HEADROOM + FC_MAX_FRAME + FC_FRAME_TAILROOM;
skb = dev_alloc_skb(len);
if (!skb) {
- printk(KERN_DEBUG DFX "Unable to allocate RQ sk_buff\n",
- fnic->fnic_no);
+ FNIC_DEBUG_FCS(DFX "Unable to allocate RQ sk_buff\n",
+ fnic->fnic_no);
return -ENOMEM;
}
skb_reset_mac_header(skb);
diff --git a/drivers/scsi/fnic/fnic_isr.c b/drivers/scsi/fnic/fnic_isr.c
index 18eb4b2..9769ae9 100644
--- a/drivers/scsi/fnic/fnic_isr.c
+++ b/drivers/scsi/fnic/fnic_isr.c
@@ -32,6 +32,14 @@
#include "fnic_io.h"
#include "fnic.h"
+static int fnic_isr_debug;
+
+#define FNIC_DEBUG_ISR(fmt...) \
+ do { \
+ if (fnic_isr_debug) \
+ FNIC_DBG(fmt); \
+ } while (0)
+
static irqreturn_t fnic_isr_legacy(int irq, void *data)
{
struct fnic *fnic = (struct fnic *)data;
@@ -265,7 +273,7 @@ int fnic_set_intr_mode(struct fnic *fnic)
fnic->intr_count = n + m + o + 1;
fnic->err_intr_offset = FNIC_MSIX_ERR_NOTIFY;
- printk(KERN_DEBUG PFX "Using MSI-X Interrupts\n");
+ FNIC_DEBUG_ISR(PFX "Using MSI-X Interrupts\n");
vnic_dev_set_intr_mode(fnic->vdev,
VNIC_DEV_INTR_MODE_MSIX);
return 0;
@@ -291,7 +299,7 @@ int fnic_set_intr_mode(struct fnic *fnic)
fnic->intr_count = 1;
fnic->err_intr_offset = 0;
- printk(KERN_DEBUG PFX "Using MSI Interrupts\n");
+ FNIC_DEBUG_ISR(PFX "Using MSI Interrupts\n");
vnic_dev_set_intr_mode(fnic->vdev, VNIC_DEV_INTR_MODE_MSI);
return 0;
@@ -316,7 +324,7 @@ int fnic_set_intr_mode(struct fnic *fnic)
fnic->cq_count = 3;
fnic->intr_count = 3;
- printk(KERN_DEBUG PFX "Using Legacy Interrupts\n");
+ FNIC_DEBUG_ISR(PFX "Using Legacy Interrupts\n");
vnic_dev_set_intr_mode(fnic->vdev, VNIC_DEV_INTR_MODE_INTX);
return 0;
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 919b2e9..ae1d3b0 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -47,6 +47,14 @@
#define PCI_DEVICE_ID_CISCO_FNIC 0x0045
+static int fnic_main_debug;
+
+#define FNIC_DEBUG_MAIN(fmt...) \
+ do { \
+ if (fnic_main_debug) \
+ FNIC_DBG(fmt); \
+ } while (0)
+
/* timer to poll notification area for events. Used in case of MSI
* interrupts being used by the device
*/
@@ -187,8 +195,8 @@ static struct fc_host_statistics *fnic_get_stats(struct Scsi_Host *host)
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
if (ret) {
- printk(KERN_DEBUG DFX "fnic: Get vnic stats failed"
- " 0x%x", fnic->fnic_no, ret);
+ FNIC_DEBUG_MAIN(DFX "fnic: Get vnic stats failed"
+ " 0x%x", fnic->fnic_no, ret);
return stats;
}
vs = fnic->stats;
@@ -243,8 +251,8 @@ static void fnic_handle_link_event(struct fnic *fnic)
u8 send_link_up = 0;
u8 send_link_down = 0;
- printk(KERN_DEBUG DFX "link %s\n", fnic->fnic_no,
- (link_status ? "up" : "down"));
+ FNIC_DEBUG_MAIN(DFX "link %s\n", fnic->fnic_no,
+ (link_status ? "up" : "down"));
spin_lock_irqsave(&fnic->fnic_lock, flags);
if (fnic->in_remove) {
@@ -286,9 +294,9 @@ static void fnic_handle_link_event(struct fnic *fnic)
if (send_link_down) {
event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
if (!event) {
- printk(KERN_DEBUG DFX "Cannot allocate a event, "
- "cannot indicate link down to FCS\n",
- fnic->fnic_no);
+ FNIC_DEBUG_MAIN(DFX "Cannot allocate a event, "
+ "cannot indicate link down to FCS\n",
+ fnic->fnic_no);
return;
}
memset(event, 0, sizeof(struct fnic_event));
@@ -305,9 +313,9 @@ static void fnic_handle_link_event(struct fnic *fnic)
if (send_link_up) {
event = kmem_cache_alloc(fnic_ev_cache, GFP_ATOMIC);
if (!event) {
- printk(KERN_DEBUG DFX "Cannot allocate a event, "
- "cannot indicate link up to FCS\n",
- fnic->fnic_no);
+ FNIC_DEBUG_MAIN(DFX "Cannot allocate a event, "
+ "cannot indicate link up to FCS\n",
+ fnic->fnic_no);
return;
}
memset(event, 0, sizeof(struct fnic_event));
@@ -735,7 +743,7 @@ static int __devinit fnic_probe(struct pci_dev *pdev,
setup_timer(&fnic->notify_timer,
fnic_notify_timer, (unsigned long)fnic);
- printk(KERN_DEBUG DFX "host no %d\n", fnic->fnic_no, host->host_no);
+ FNIC_DEBUG_MAIN(DFX "host no %d\n", fnic->fnic_no, host->host_no);
/* allocate RQ buffers and post them to RQ*/
for (i = 0; i < fnic->rq_count; i++) {
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
index 5d00ad5..5bfede7 100644
--- a/drivers/scsi/fnic/fnic_scsi.c
+++ b/drivers/scsi/fnic/fnic_scsi.c
@@ -44,6 +44,14 @@
#include "fnic_io.h"
#include "fnic.h"
+static int fnic_scsi_debug;
+
+#define FNIC_DEBUG_SCSI(fmt...) \
+ do { \
+ if (fnic_scsi_debug) \
+ FNIC_DBG(fmt); \
+ } while (0)
+
static const char *fnic_ioreq_state_str[] = {
[FNIC_IOREQ_CMD_PENDING] = "FNIC_IOREQ_CMD_PENDING",
[FNIC_IOREQ_ABTS_PENDING] = "FNIC_IOREQ_ABTS_PENDING",
@@ -158,10 +166,10 @@ int fnic_fw_reset_handler(struct fnic *fnic)
spin_unlock_irqrestore(&fnic->wq_copy_lock[0], flags);
if (!ret)
- printk(KERN_DEBUG DFX "Issued fw reset\n", fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Issued fw reset\n", fnic->fnic_no);
else
- printk(KERN_DEBUG DFX "Failed to issue fw reset\n",
- fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Failed to issue fw reset\n",
+ fnic->fnic_no);
return ret;
}
@@ -204,7 +212,7 @@ flogi_reg_ioreq_end:
spin_unlock_irqrestore(&fnic->wq_copy_lock[0], flags);
if (!ret)
- printk(KERN_DEBUG DFX "flog reg issued\n", fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "flogi reg issued\n", fnic->fnic_no);
return ret;
}
@@ -452,13 +460,14 @@ static int fnic_fcpio_fw_reset_cmpl_handler(struct fnic *fnic,
if (fnic->state == FNIC_IN_FC_TRANS_ETH_MODE) {
/* Check status of reset completion */
if (!hdr_status) {
- printk(KERN_DEBUG DFX "reset cmpl success\n",
- fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "reset cmpl success\n",
+ fnic->fnic_no);
/* Ready to send flogi out */
fnic->state = FNIC_IN_ETH_MODE;
} else {
- printk(KERN_DEBUG DFX "fnic fw_reset : failed %s\n",
- fnic->fnic_no, fcpio_status_str[hdr_status]);
+ FNIC_DEBUG_SCSI(DFX "fnic fw_reset : failed %s\n",
+ fnic->fnic_no,
+ fcpio_status_str[hdr_status]);
/* Unable to change to eth mode, cannot send out flogi
* Change state to fc mode, so that subsequent Flogi
@@ -469,8 +478,9 @@ static int fnic_fcpio_fw_reset_cmpl_handler(struct fnic *fnic,
ret = -1;
}
} else {
- printk(KERN_DEBUG PFX "Unexpected state %s while processing"
- " reset cmpl\n", fnic_state_str[fnic->state]);
+ FNIC_DEBUG_SCSI(DFX "Unexpected state %s while processing"
+ " reset cmpl\n", fnic->fnic_no,
+ fnic_state_str[fnic->state]);
ret = -1;
}
@@ -530,19 +540,20 @@ static int fnic_fcpio_flogi_reg_cmpl_handler(struct fnic *fnic,
/* Check flogi registration completion status */
if (!hdr_status) {
- printk(KERN_DEBUG DFX "flog reg succeeded\n",
- fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "flog reg succeeded\n",
+ fnic->fnic_no);
fnic->state = FNIC_IN_FC_MODE;
} else {
- printk(KERN_DEBUG DFX "fnic flogi reg :failed %s\n",
- fnic->fnic_no, fcpio_status_str[hdr_status]);
+ FNIC_DEBUG_SCSI(DFX "fnic flogi reg :failed %s\n",
+ fnic->fnic_no,
+ fcpio_status_str[hdr_status]);
fnic->state = FNIC_IN_ETH_MODE;
ret = -1;
}
} else {
- printk(KERN_DEBUG PFX "Unexpected fnic state %s while"
- " processing flogi reg completion\n",
- fnic_state_str[fnic->state]);
+ FNIC_DEBUG_SCSI(DFX "Unexpected fnic state %s while"
+ " processing flogi reg completion\n",
+ fnic->fnic_no, fnic_state_str[fnic->state]);
ret = -1;
}
@@ -833,26 +844,26 @@ static void fnic_fcpio_itmf_cmpl_handler(struct fnic *fnic,
CMD_STATE(sc) = FNIC_IOREQ_ABTS_COMPLETE;
CMD_ABTS_STATUS(sc) = hdr_status;
- printk(KERN_DEBUG DFX "abort complete. id %d status %s\n",
- fnic->fnic_no, (int)(id & FNIC_TAG_MASK),
- fcpio_status_str[hdr_status]);
+ FNIC_DEBUG_SCSI(DFX "abts cmpl recd. id %d status %s\n",
+ fnic->fnic_no, (int)(id & FNIC_TAG_MASK),
+ fcpio_status_str[hdr_status]);
if (io_req->abts_done)
complete(io_req->abts_done);
-
+
} else if (id & FNIC_TAG_DEV_RST) {
/* Completion of device reset */
CMD_LR_STATUS(sc) = hdr_status;
CMD_STATE(sc) = FNIC_IOREQ_CMD_COMPLETE;
- printk(KERN_DEBUG DFX "dev reset complete. id %d status %s\n",
- fnic->fnic_no, (int)(id & FNIC_TAG_MASK),
- fcpio_status_str[hdr_status]);
+ FNIC_DEBUG_SCSI(DFX "dev reset cmpl recvd. id %d status %s\n",
+ fnic->fnic_no, (int)(id & FNIC_TAG_MASK),
+ fcpio_status_str[hdr_status]);
if (io_req->dr_done)
complete(io_req->dr_done);
} else
printk(KERN_ERR DFX "Unexpected itmf io state %s tag %x\n",
fnic->fnic_no, fnic_ioreq_state_str[CMD_STATE(sc)], id);
-
+
spin_unlock_irqrestore(io_lock, flags);
}
@@ -889,8 +900,8 @@ static int fnic_fcpio_cmpl_handler(struct vnic_dev *vdev,
break;
default:
- printk(KERN_DEBUG DFX "firmware completion type %d\n",
- fnic->fnic_no, desc->hdr.type);
+ FNIC_DEBUG_SCSI(DFX "firmware completion type %d\n",
+ fnic->fnic_no, desc->hdr.type);
break;
}
@@ -953,9 +964,9 @@ static void fnic_cleanup_io(struct fnic *fnic, int exclude_id)
cleanup_scsi_cmd:
sc->result = DID_TRANSPORT_DISRUPTED << 16;
- printk(KERN_DEBUG DFX "fnic_cleanup_io:"
- " DID_TRANSPORT_DISRUPTED\n", fnic->fnic_no);
-
+ FNIC_DEBUG_SCSI(DFX "fnic_cleanup_io:"
+ " DID_TRANSPORT_DISRUPTED\n", fnic->fnic_no);
+
/* Complete the command to SCSI */
if (sc->scsi_done)
sc->scsi_done(sc);
@@ -1005,9 +1016,9 @@ void fnic_wq_copy_cleanup_handler(struct vnic_wq_copy *wq,
wq_copy_cleanup_scsi_cmd:
sc->result = DID_NO_CONNECT << 16;
- printk(KERN_DEBUG DFX "wq_copy_cleanup_handler:"
- " did_no_connect\n", fnic->fnic_no);
-
+ FNIC_DEBUG_SCSI(DFX "wq_copy_cleanup_handler:"
+ " DID_NO_CONNECT\n", fnic->fnic_no);
+
if (sc->scsi_done)
sc->scsi_done(sc);
}
@@ -1087,7 +1098,10 @@ int fnic_abort_cmd(struct scsi_cmnd *sc)
lp = shost_priv(sc->device->host);
fnic = lport_priv(lp);
- printk(KERN_DEBUG DFX "fnic_abort_cmd called\n", fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Abort Cmd called FCID 0x%x, LUN 0x%x TAG %d\n",
+ fnic->fnic_no,
+ (starget_to_rport(scsi_target(sc->device)))->port_id,
+ sc->device->lun, sc->request->tag);
if (lp->state != LPORT_ST_READY || !(lp->link_status & FC_LINK_UP)) {
ret = FAILED;
@@ -1191,8 +1205,9 @@ int fnic_abort_cmd(struct scsi_cmnd *sc)
mempool_free(io_req, fnic->io_req_pool);
fnic_abort_cmd_end:
- printk(KERN_DEBUG DFX "Returning from abort cmd %s\n",
- fnic->fnic_no, (ret == SUCCESS) ? "SUCCESS" : "FAILED");
+ FNIC_DEBUG_SCSI(DFX "Returning from abort cmd %s\n",
+ fnic->fnic_no, (ret == SUCCESS) ?
+ "SUCCESS" : "FAILED");
return ret;
}
@@ -1219,9 +1234,6 @@ static inline int fnic_queue_dr_io_req(struct fnic *fnic,
int_to_scsilun(sc->device->lun, &fc_lun);
rport = starget_to_rport(scsi_target(sc->device));
- printk(KERN_DEBUG DFX "FCID 0x%x LunID %d\n", fnic->fnic_no,
- rport->port_id, sc->device->lun);
-
fnic_queue_wq_copy_desc_itmf(
wq,
sc->request->tag | FNIC_TAG_DEV_RST, /* host request id */
@@ -1281,8 +1293,9 @@ static int fnic_clean_pending_aborts(struct fnic *fnic,
/* Found IO that is still pending with firmware and
* belongs to the LUN that we are resetting
*/
- printk(KERN_DEBUG DFX "Found IO in %s on lun\n",
- fnic->fnic_no, fnic_ioreq_state_str[CMD_STATE(sc)]);
+ FNIC_DEBUG_SCSI(DFX "Found IO in %s on lun\n",
+ fnic->fnic_no,
+ fnic_ioreq_state_str[CMD_STATE(sc)]);
io_req->abts_done = &tm_done;
spin_unlock_irqrestore(io_lock, flags);
@@ -1358,7 +1371,10 @@ int fnic_device_reset(struct scsi_cmnd *sc)
lp = shost_priv(sc->device->host);
fnic = lport_priv(lp);
- printk(KERN_DEBUG DFX "Device reset called\n", fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Device Reset called FCID 0x%x, LUN 0x%x\n",
+ fnic->fnic_no,
+ (starget_to_rport(scsi_target(sc->device)))->port_id,
+ sc->device->lun);
if (lp->state != LPORT_ST_READY || !(lp->link_status & FC_LINK_UP))
goto fnic_device_reset_end;
@@ -1390,6 +1406,8 @@ int fnic_device_reset(struct scsi_cmnd *sc)
CMD_LR_STATUS(sc) = FCPIO_INVALID_CODE;
spin_unlock_irqrestore(io_lock, flags);
+ FNIC_DEBUG_SCSI(DFX "TAG %d\n", fnic->fnic_no, sc->request->tag);
+
/* issue the device reset
* if enqueue failed, let io_req remain allocated and attached
* to SCSI cmd, it will get freed during higher levels of EH
@@ -1425,15 +1443,15 @@ int fnic_device_reset(struct scsi_cmnd *sc)
* gets cleaned up during higher levels of EH
*/
if (status == FCPIO_INVALID_CODE) {
- printk(KERN_DEBUG DFX "Device reset timed out\n",
- fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Device reset timed out\n",
+ fnic->fnic_no);
goto fnic_device_reset_end;
}
/* Completed, but not successful */
if (status != FCPIO_SUCCESS) {
- printk(KERN_DEBUG DFX "Device reset completed - failed\n",
- fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Device reset completed - failed\n",
+ fnic->fnic_no);
goto fnic_device_reset_end;
}
@@ -1445,9 +1463,9 @@ int fnic_device_reset(struct scsi_cmnd *sc)
* of EH will kick in
*/
if (fnic_clean_pending_aborts(fnic, sc)) {
- printk(KERN_DEBUG DFX "Device reset failed"
- " since could not abort all IOs\n",
- fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "Device reset failed"
+ " since could not abort all IOs\n",
+ fnic->fnic_no);
goto fnic_device_reset_end;
}
@@ -1467,8 +1485,9 @@ int fnic_device_reset(struct scsi_cmnd *sc)
ret = SUCCESS;
fnic_device_reset_end:
- printk(KERN_DEBUG DFX "Returning from device reset %s\n",
- fnic->fnic_no, (ret == SUCCESS) ? "SUCCESS" : "FAILED");
+ FNIC_DEBUG_SCSI(DFX "Returning from device reset %s\n",
+ fnic->fnic_no, (ret == SUCCESS) ?
+ "SUCCESS" : "FAILED");
return ret;
}
@@ -1482,7 +1501,7 @@ int fnic_reset(struct Scsi_Host *shost)
lp = shost_priv(shost);
fnic = lport_priv(lp);
- printk(KERN_DEBUG DFX "fnic_reset called\n", fnic->fnic_no);
+ FNIC_DEBUG_SCSI(DFX "fnic_reset called\n", fnic->fnic_no);
/* Reset local port, this will clean up libFC exchanges,
* reset remote port sessions, and if link is up, begin flogi
@@ -1490,8 +1509,9 @@ int fnic_reset(struct Scsi_Host *shost)
if (lp->tt.lport_reset(lp))
ret = FAILED;
- printk(KERN_DEBUG DFX "Returning from fnic reset %s\n",
- fnic->fnic_no, (ret == SUCCESS) ? "SUCCESS" : "FAILED");
+ FNIC_DEBUG_SCSI(DFX "Returning from fnic reset %s\n",
+ fnic->fnic_no, (ret == SUCCESS) ?
+ "SUCCESS" : "FAILED");
return ret;
}
@@ -1570,8 +1590,9 @@ void fnic_scsi_abort_io(struct fc_lport *lp)
spin_lock_irqsave(&fnic->fnic_lock, flags);
fnic->remove_wait = NULL;
- printk(KERN_DEBUG DFX "fnic_scsi_abort_io %s\n", fnic->fnic_no,
- (fnic->state == FNIC_IN_ETH_MODE) ? "SUCCESS" : "FAILED");
+ FNIC_DEBUG_SCSI(DFX "fnic_scsi_abort_io %s\n", fnic->fnic_no,
+ (fnic->state == FNIC_IN_ETH_MODE) ?
+ "SUCCESS" : "FAILED");
spin_unlock_irqrestore(&fnic->fnic_lock, flags);
abort_io_end:
++++++ fnic_11.patch ++++++
fnic: Set host_maxframe_size and supported_speeds attributes
Signed-off-by: Abhijeet Joglekar
---
drivers/scsi/fnic/fnic_main.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index ae1d3b0..cd479d5 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -134,7 +134,9 @@ static struct fc_function_template fnic_fc_functions = {
.show_host_supported_classes = 1,
.show_host_supported_fc4s = 1,
.show_host_active_fc4s = 1,
+ .show_host_maxframe_size = 1,
.show_host_port_id = 1,
+ .show_host_supported_speeds = 1,
.get_host_speed = fnic_get_host_speed,
.show_host_speed = 1,
.show_host_port_type = 1,
@@ -787,6 +789,7 @@ static int __devinit fnic_probe(struct pci_dev *pdev,
lp->boot_time = jiffies;
lp->e_d_tov = fnic->config.ed_tov;
lp->r_a_tov = fnic->config.ra_tov;
+ lp->link_supported_speeds = FC_PORTSPEED_10GBIT;
fc_set_wwnn(lp, fnic->config.node_wwn);
fc_set_wwpn(lp, fnic->config.port_wwn);
@@ -803,6 +806,7 @@ static int __devinit fnic_probe(struct pci_dev *pdev,
err = -EINVAL;
goto err_out_free_exch_mgr;
}
+ fc_host_maxframe_size(lp->host) = lp->mfs;
sprintf(fc_host_symbolic_name(lp->host),
DRV_NAME " v" DRV_VERSION " over %s", fnic->name);
++++++ fnic.patch ++++++
--- /var/tmp/diff_new_pack.A16138/_old 2008-12-05 15:16:16.000000000 +0100
+++ /var/tmp/diff_new_pack.A16138/_new 2008-12-05 15:16:16.000000000 +0100
@@ -12,7 +12,7 @@
===================================================================
--- fnic.orig/fnic.h
+++ fnic/fnic.h
-@@ -34,6 +35,10 @@
+@@ -35,6 +35,10 @@
#include "vnic_stats.h"
#include "vnic_scsi.h"
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org