]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-rc1-update
Move xen patchset to new version's subdir.
[ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / open-fcoe-rc1-update
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-rc1-update b/src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-rc1-update
new file mode 100644 (file)
index 0000000..f140e2d
--- /dev/null
@@ -0,0 +1,326 @@
+Subject: Update open-FCoE with latest patches from Intel
+From: John Fastabend <john.r.fastabend@intel.com>
+Date: Fri Dec 5 16:35:38 2008 +0100:
+References: bnc#438954
+
+This updates the open-FCoE stack to version 1.0.5.
+
+Signed-off-by: John Fastabend <john.r.fastabend@intel.com>
+Acked-by: Hannes Reinecke <hare@suse.de>
+
+diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c
+index de29ccd..77f8857 100644
+--- a/drivers/scsi/fcoe/libfcoe.c
++++ b/drivers/scsi/fcoe/libfcoe.c
+@@ -59,7 +59,7 @@ static int debug_fcoe;
+ MODULE_AUTHOR("Open-FCoE.org");
+ MODULE_DESCRIPTION("FCoE");
+ MODULE_LICENSE("GPL");
+-MODULE_VERSION("1.0.4");
++MODULE_VERSION("1.0.5");
+ /* fcoe host list */
+ LIST_HEAD(fcoe_hostlist);
+@@ -453,10 +453,9 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
+       /* adjust skb netowrk/transport offsets to match mac/fcoe/fc */
+       skb_push(skb, elen + hlen);
+       skb_reset_mac_header(skb);
+-      skb_set_network_header(skb, elen);
+-      skb_set_transport_header(skb, elen + hlen);
++      skb_reset_network_header(skb);
+       skb->mac_len = elen;
+-      skb->protocol = htons(ETH_P_FCOE);
++      skb->protocol = htons(ETH_P_802_3);
+       skb->dev = fc->real_dev;
+       /* fill up mac and fcoe headers */
+@@ -473,7 +472,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
+       else
+               memcpy(eh->h_source, fc->data_src_addr, ETH_ALEN);
+-      hp = (struct fcoe_hdr *)skb_network_header(skb);
++      hp = (struct fcoe_hdr *)(eh + 1);
+       memset(hp, 0, sizeof(*hp));
+       if (FC_FCOE_VER)
+               FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
+diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c
+index aee2f9c..0cd8d0c 100644
+--- a/drivers/scsi/libfc/fc_disc.c
++++ b/drivers/scsi/libfc/fc_disc.c
+@@ -45,9 +45,6 @@ static int fc_disc_debug;
+                       FC_DBG(fmt);            \
+       } while (0)
+-static struct mutex           disc_list_lock;
+-static struct list_head               disc_list;
+-
+ struct fc_disc {
+       unsigned char           retry_count;
+       unsigned char           delay;
+@@ -66,7 +63,6 @@ struct fc_disc {
+       struct fc_gpn_ft_resp   partial_buf;    /* partial name buffer */
+       struct delayed_work     disc_work;
+-      struct list_head        list;
+ };
+ static void fc_disc_gpn_ft_req(struct fc_disc *);
+@@ -87,26 +83,23 @@ static void fc_disc_restart(struct fc_disc *);
+ struct fc_rport *fc_disc_lookup_rport(const struct fc_lport *lport,
+                                     u32 port_id)
+ {
+-      struct fc_disc *disc;
++      struct fc_disc *disc = lport->disc;
+       struct fc_rport *rport, *found = NULL;
+       struct fc_rport_libfc_priv *rdata;
+       int disc_found = 0;
+-      mutex_lock(&disc_list_lock);
+-      list_for_each_entry(disc, &disc_list, list) {
+-              if (disc->lport == lport) {
+-                      list_for_each_entry(rdata, &disc->rports, peers) {
+-                              rport = PRIV_TO_RPORT(rdata);
+-                              if (rport->port_id == port_id) {
+-                                      disc_found = 1;
+-                                      found = rport;
+-                                      get_device(&found->dev);
+-                                      break;
+-                              }
+-                      }
++      if (!disc)
++              return NULL;
++
++      list_for_each_entry(rdata, &disc->rports, peers) {
++              rport = PRIV_TO_RPORT(rdata);
++              if (rport->port_id == port_id) {
++                      disc_found = 1;
++                      found = rport;
++                      get_device(&found->dev);
++                      break;
+               }
+       }
+-      mutex_unlock(&disc_list_lock);
+       if (!disc_found) {
+               FC_DEBUG_DISC("The rport (%6x) for lport (%6x) "
+@@ -127,19 +120,15 @@ static inline struct fc_disc *fc_disc_alloc(struct fc_lport *lport)
+       struct fc_disc *disc;
+       disc = kzalloc(sizeof(struct fc_disc), GFP_KERNEL);
+-      INIT_LIST_HEAD(&disc->list);
+       INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout);
+       mutex_init(&disc->disc_mutex);
+       INIT_LIST_HEAD(&disc->rports);
+       disc->lport = lport;
++      lport->disc = disc;
+       disc->delay = FC_DISC_DELAY;
+       disc->event = DISC_EV_NONE;
+-      mutex_lock(&disc_list_lock);
+-      list_add_tail(&disc->list, &disc_list);
+-      mutex_unlock(&disc_list_lock);
+-
+       return disc;
+ }
+@@ -182,23 +171,19 @@ static void fc_disc_rport_event(struct fc_lport *lport,
+                               enum fc_lport_event event)
+ {
+       struct fc_rport_libfc_priv *rdata = rport->dd_data;
+-      struct fc_disc *disc;
++      struct fc_disc *disc = lport->disc;
+       int found = 0;
+       FC_DEBUG_DISC("Received a %d event for port (%6x)\n", event,
+                     rport->port_id);
+       if (event == RPORT_EV_CREATED) {
+-              mutex_lock(&disc_list_lock);
+-              list_for_each_entry(disc, &disc_list, list) {
+-                      if (disc->lport == lport) {
+-                              found = 1;
+-                              mutex_lock(&disc->disc_mutex);
+-                              list_add_tail(&rdata->peers, &disc->rports);
+-                              mutex_unlock(&disc->disc_mutex);
+-                      }
++              if (disc) {
++                      found = 1;
++                      mutex_lock(&disc->disc_mutex);
++                      list_add_tail(&rdata->peers, &disc->rports);
++                      mutex_unlock(&disc->disc_mutex);
+               }
+-              mutex_unlock(&disc_list_lock);
+       }
+       if (!found)
+@@ -323,19 +308,9 @@ static void fc_disc_recv_req(struct fc_seq *sp, struct fc_frame *fp,
+                            struct fc_lport *lport)
+ {
+       u8 op;
+-      struct fc_disc *disc;
+-      int found = 0;
+-
+-      mutex_lock(&disc_list_lock);
+-      list_for_each_entry(disc, &disc_list, list) {
+-              if (disc->lport == lport) {
+-                      found = 1;
+-                      break;
+-              }
+-      }
+-      mutex_unlock(&disc_list_lock);
++      struct fc_disc *disc = lport->disc;
+-      if (!found) {
++      if (!disc) {
+               FC_DBG("Received a request for an lport not managed "
+                      "by the discovery engine\n");
+               return;
+@@ -394,19 +369,9 @@ static void fc_disc_start(void (*disc_callback)(struct fc_lport *,
+ {
+       struct fc_rport *rport;
+       struct fc_rport_identifiers ids;
+-      struct fc_disc *disc;
+-      int found = 0;
+-
+-      mutex_lock(&disc_list_lock);
+-      list_for_each_entry(disc, &disc_list, list) {
+-              if (disc->lport == lport) {
+-                      found = 1;
+-                      break;
+-              }
+-      }
+-      mutex_unlock(&disc_list_lock);
++      struct fc_disc *disc = lport->disc;
+-      if (!found) {
++      if (!disc) {
+               FC_DEBUG_DISC("No existing discovery job, "
+                             "creating one for lport (%6x)\n",
+                             fc_host_port_id(lport->host));
+@@ -510,7 +475,7 @@ static int fc_disc_new_target(struct fc_disc *disc,
+                               rport = fc_rport_rogue_create(&dp);
+                       }
+                       if (!rport)
+-                              error = ENOMEM;
++                              error = -ENOMEM;
+               }
+               if (rport) {
+                       rp = rport->dd_data;
+@@ -577,18 +542,16 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
+               if (disc->retry_count < FC_DISC_RETRY_LIMIT) {
+                       /* go ahead and retry */
+                       if (!fp)
+-                              delay = msecs_to_jiffies(500);
++                              delay = msecs_to_jiffies(FC_DISC_RETRY_DELAY);
+                       else {
+-                              delay = jiffies +
+-                                      msecs_to_jiffies(lport->e_d_tov);
++                              delay = msecs_to_jiffies(lport->e_d_tov);
+                               /* timeout faster first time */
+                               if (!disc->retry_count)
+                                       delay /= 4;
+                       }
+                       disc->retry_count++;
+-                      schedule_delayed_work(&disc->disc_work,
+-                                            delay);
++                      schedule_delayed_work(&disc->disc_work, delay);
+               } else {
+                       /* exceeded retries */
+                       disc->event = DISC_EV_FAILED;
+@@ -868,16 +831,12 @@ out:
+  */
+ void fc_disc_stop(struct fc_lport *lport)
+ {
+-      struct fc_disc *disc, *next;
++      struct fc_disc *disc = lport->disc;
+-      mutex_lock(&disc_list_lock);
+-      list_for_each_entry_safe(disc, next, &disc_list, list) {
+-              if (disc->lport == lport) {
+-                      cancel_delayed_work_sync(&disc->disc_work);
+-                      fc_disc_stop_rports(disc);
+-              }
++      if (disc) {
++              cancel_delayed_work_sync(&disc->disc_work);
++              fc_disc_stop_rports(disc);
+       }
+-      mutex_unlock(&disc_list_lock);
+ }
+ /**
+@@ -889,18 +848,8 @@ void fc_disc_stop(struct fc_lport *lport)
+  */
+ void fc_disc_stop_final(struct fc_lport *lport)
+ {
+-      struct fc_disc *disc, *next;
+       fc_disc_stop(lport);
+       lport->tt.rport_flush_queue();
+-
+-      mutex_lock(&disc_list_lock);
+-      list_for_each_entry_safe(disc, next, &disc_list, list) {
+-              if (disc->lport == lport) {
+-                      list_del(&disc->list);
+-                      kfree(disc);
+-              }
+-      }
+-      mutex_unlock(&disc_list_lock);
+ }
+ /**
+@@ -909,8 +858,6 @@ void fc_disc_stop_final(struct fc_lport *lport)
+  */
+ int fc_disc_init(struct fc_lport *lport)
+ {
+-      INIT_LIST_HEAD(&disc_list);
+-      mutex_init(&disc_list_lock);
+       if (!lport->tt.disc_start)
+               lport->tt.disc_start = fc_disc_start;
+diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
+index 04ced7f..2426501 100644
+--- a/drivers/scsi/libfc/fc_fcp.c
++++ b/drivers/scsi/libfc/fc_fcp.c
+@@ -42,6 +42,7 @@
+ MODULE_AUTHOR("Open-FCoE.org");
+ MODULE_DESCRIPTION("libfc");
+ MODULE_LICENSE("GPL");
++MODULE_VERSION("1.0.5");
+ static int fc_fcp_debug;
+diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
+index 083d57b..de16203 100644
+--- a/drivers/scsi/libfc/fc_lport.c
++++ b/drivers/scsi/libfc/fc_lport.c
+@@ -577,6 +577,8 @@ int fc_fabric_logoff(struct fc_lport *lport)
+ {
+       lport->tt.disc_stop_final(lport);
+       mutex_lock(&lport->lp_mutex);
++      kfree(lport->disc);
++      lport->disc = NULL;
+       fc_lport_enter_logo(lport);
+       mutex_unlock(&lport->lp_mutex);
+       return 0;
+diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
+index dac03e2..587be50 100644
+--- a/include/scsi/libfc.h
++++ b/include/scsi/libfc.h
+@@ -570,6 +570,8 @@ struct libfc_function_template {
+       void (*disc_stop_final) (struct fc_lport *);
+ };
++struct fc_disc;
++
+ struct fc_lport {
+       struct list_head list;
+@@ -578,6 +580,7 @@ struct fc_lport {
+       struct fc_exch_mgr      *emp;
+       struct fc_rport         *dns_rp;
+       struct fc_rport         *ptp_rp;
++      struct fc_disc          *disc;
+       void                    *scsi_priv;
+       /* Operational Information */