Merge with rsync://rsync.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
[linux-2.6] / drivers / message / fusion / mptlan.c
1 /*
2  *  linux/drivers/message/fusion/mptlan.c
3  *      IP Over Fibre Channel device driver.
4  *      For use with LSI Logic Fibre Channel PCI chip/adapters
5  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
6  *
7  *  Copyright (c) 2000-2005 LSI Logic Corporation
8  *
9  */
10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
11 /*
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; version 2 of the License.
15
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20
21     NO WARRANTY
22     THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
23     CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
24     LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
25     MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
26     solely responsible for determining the appropriateness of using and
27     distributing the Program and assumes all risks associated with its
28     exercise of rights under this Agreement, including but not limited to
29     the risks and costs of program errors, damage to or loss of data,
30     programs or equipment, and unavailability or interruption of operations.
31
32     DISCLAIMER OF LIABILITY
33     NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
34     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35     DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
36     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
37     TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
38     USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
39     HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
40
41     You should have received a copy of the GNU General Public License
42     along with this program; if not, write to the Free Software
43     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
44 */
45
46 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
47 /*
48  * Define statements used for debugging
49  */
50 //#define MPT_LAN_IO_DEBUG
51
52 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
53
54 #include "mptlan.h"
55 #include <linux/init.h>
56 #include <linux/module.h>
57 #include <linux/fs.h>
58
59 #define MYNAM           "mptlan"
60
61 MODULE_LICENSE("GPL");
62
63 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
64 /*
65  * MPT LAN message sizes without variable part.
66  */
67 #define MPT_LAN_RECEIVE_POST_REQUEST_SIZE \
68         (sizeof(LANReceivePostRequest_t) - sizeof(SGE_MPI_UNION))
69
70 #define MPT_LAN_TRANSACTION32_SIZE \
71         (sizeof(SGETransaction32_t) - sizeof(u32))
72
73 /*
74  *  Fusion MPT LAN private structures
75  */
76
77 struct NAA_Hosed {
78         u16 NAA;
79         u8 ieee[FC_ALEN];
80         struct NAA_Hosed *next;
81 };
82
83 struct BufferControl {
84         struct sk_buff  *skb;
85         dma_addr_t      dma;
86         unsigned int    len;
87 };
88
89 struct mpt_lan_priv {
90         MPT_ADAPTER *mpt_dev;
91         u8 pnum; /* Port number in the IOC. This is not a Unix network port! */
92
93         atomic_t buckets_out;           /* number of unused buckets on IOC */
94         int bucketthresh;               /* Send more when this many left */
95
96         int *mpt_txfidx; /* Free Tx Context list */
97         int mpt_txfidx_tail;
98         spinlock_t txfidx_lock;
99
100         int *mpt_rxfidx; /* Free Rx Context list */
101         int mpt_rxfidx_tail;
102         spinlock_t rxfidx_lock;
103
104         struct BufferControl *RcvCtl;   /* Receive BufferControl structs */
105         struct BufferControl *SendCtl;  /* Send BufferControl structs */
106
107         int max_buckets_out;            /* Max buckets to send to IOC */
108         int tx_max_out;                 /* IOC's Tx queue len */
109
110         u32 total_posted;
111         u32 total_received;
112         struct net_device_stats stats;  /* Per device statistics */
113
114         struct work_struct post_buckets_task;
115         unsigned long post_buckets_active;
116 };
117
118 struct mpt_lan_ohdr {
119         u16     dtype;
120         u8      daddr[FC_ALEN];
121         u16     stype;
122         u8      saddr[FC_ALEN];
123 };
124
125 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
126
127 /*
128  *  Forward protos...
129  */
130 static int  lan_reply (MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf,
131                        MPT_FRAME_HDR *reply);
132 static int  mpt_lan_open(struct net_device *dev);
133 static int  mpt_lan_reset(struct net_device *dev);
134 static int  mpt_lan_close(struct net_device *dev);
135 static void mpt_lan_post_receive_buckets(void *dev_id);
136 static void mpt_lan_wake_post_buckets_task(struct net_device *dev,
137                                            int priority);
138 static int  mpt_lan_receive_post_turbo(struct net_device *dev, u32 tmsg);
139 static int  mpt_lan_receive_post_reply(struct net_device *dev,
140                                        LANReceivePostReply_t *pRecvRep);
141 static int  mpt_lan_send_turbo(struct net_device *dev, u32 tmsg);
142 static int  mpt_lan_send_reply(struct net_device *dev,
143                                LANSendReply_t *pSendRep);
144 static int  mpt_lan_ioc_reset(MPT_ADAPTER *ioc, int reset_phase);
145 static int  mpt_lan_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
146 static unsigned short mpt_lan_type_trans(struct sk_buff *skb,
147                                          struct net_device *dev);
148
149 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
150 /*
151  *  Fusion MPT LAN private data
152  */
153 static int LanCtx = -1;
154
155 static u32 max_buckets_out = 127;
156 static u32 tx_max_out_p = 127 - 16;
157
158 #ifdef QLOGIC_NAA_WORKAROUND
159 static struct NAA_Hosed *mpt_bad_naa = NULL;
160 DEFINE_RWLOCK(bad_naa_lock);
161 #endif
162
163 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
164 /*
165  * Fusion MPT LAN external data
166  */
167 extern int mpt_lan_index;
168
169 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
170 /**
171  *      lan_reply - Handle all data sent from the hardware.
172  *      @ioc: Pointer to MPT_ADAPTER structure
173  *      @mf: Pointer to original MPT request frame (NULL if TurboReply)
174  *      @reply: Pointer to MPT reply frame
175  *
176  *      Returns 1 indicating original alloc'd request frame ptr
177  *      should be freed, or 0 if it shouldn't.
178  */
179 static int
180 lan_reply (MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
181 {
182         struct net_device *dev = ioc->netdev;
183         int FreeReqFrame = 0;
184
185         dioprintk((KERN_INFO MYNAM ": %s/%s: Got reply.\n",
186                   IOC_AND_NETDEV_NAMES_s_s(dev)));
187
188 //      dioprintk((KERN_INFO MYNAM "@lan_reply: mf = %p, reply = %p\n",
189 //                      mf, reply));
190
191         if (mf == NULL) {
192                 u32 tmsg = CAST_PTR_TO_U32(reply);
193
194                 dioprintk((KERN_INFO MYNAM ": %s/%s: @lan_reply, tmsg %08x\n",
195                                 IOC_AND_NETDEV_NAMES_s_s(dev),
196                                 tmsg));
197
198                 switch (GET_LAN_FORM(tmsg)) {
199
200                 // NOTE!  (Optimization) First case here is now caught in
201                 //  mptbase.c::mpt_interrupt() routine and callcack here
202                 //  is now skipped for this case!
203 #if 0
204                 case LAN_REPLY_FORM_MESSAGE_CONTEXT:
205 //                      dioprintk((KERN_INFO MYNAM "/lan_reply: "
206 //                                "MessageContext turbo reply received\n"));
207                         FreeReqFrame = 1;
208                         break;
209 #endif
210
211                 case LAN_REPLY_FORM_SEND_SINGLE:
212 //                      dioprintk((MYNAM "/lan_reply: "
213 //                                "calling mpt_lan_send_reply (turbo)\n"));
214
215                         // Potential BUG here?
216                         //      FreeReqFrame = mpt_lan_send_turbo(dev, tmsg);
217                         //  If/when mpt_lan_send_turbo would return 1 here,
218                         //  calling routine (mptbase.c|mpt_interrupt)
219                         //  would Oops because mf has already been set
220                         //  to NULL.  So after return from this func,
221                         //  mpt_interrupt() will attempt to put (NULL) mf ptr
222                         //  item back onto its adapter FreeQ - Oops!:-(
223                         //  It's Ok, since mpt_lan_send_turbo() *currently*
224                         //  always returns 0, but..., just in case:
225
226                         (void) mpt_lan_send_turbo(dev, tmsg);
227                         FreeReqFrame = 0;
228
229                         break;
230
231                 case LAN_REPLY_FORM_RECEIVE_SINGLE:
232 //                      dioprintk((KERN_INFO MYNAM "@lan_reply: "
233 //                                "rcv-Turbo = %08x\n", tmsg));
234                         mpt_lan_receive_post_turbo(dev, tmsg);
235                         break;
236
237                 default:
238                         printk (KERN_ERR MYNAM "/lan_reply: Got a turbo reply "
239                                 "that I don't know what to do with\n");
240
241                         /* CHECKME!  Hmmm...  FreeReqFrame is 0 here; is that right? */
242
243                         break;
244                 }
245
246                 return FreeReqFrame;
247         }
248
249 //      msg = (u32 *) reply;
250 //      dioprintk((KERN_INFO MYNAM "@lan_reply: msg = %08x %08x %08x %08x\n",
251 //                le32_to_cpu(msg[0]), le32_to_cpu(msg[1]),
252 //                le32_to_cpu(msg[2]), le32_to_cpu(msg[3])));
253 //      dioprintk((KERN_INFO MYNAM "@lan_reply: Function = %02xh\n",
254 //                reply->u.hdr.Function));
255
256         switch (reply->u.hdr.Function) {
257
258         case MPI_FUNCTION_LAN_SEND:
259         {
260                 LANSendReply_t *pSendRep;
261
262                 pSendRep = (LANSendReply_t *) reply;
263                 FreeReqFrame = mpt_lan_send_reply(dev, pSendRep);
264                 break;
265         }
266
267         case MPI_FUNCTION_LAN_RECEIVE:
268         {
269                 LANReceivePostReply_t *pRecvRep;
270
271                 pRecvRep = (LANReceivePostReply_t *) reply;
272                 if (pRecvRep->NumberOfContexts) {
273                         mpt_lan_receive_post_reply(dev, pRecvRep);
274                         if (!(pRecvRep->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY))
275                                 FreeReqFrame = 1;
276                 } else
277                         dioprintk((KERN_INFO MYNAM "@lan_reply: zero context "
278                                   "ReceivePostReply received.\n"));
279                 break;
280         }
281
282         case MPI_FUNCTION_LAN_RESET:
283                 /* Just a default reply. Might want to check it to
284                  * make sure that everything went ok.
285                  */
286                 FreeReqFrame = 1;
287                 break;
288
289         case MPI_FUNCTION_EVENT_NOTIFICATION:
290         case MPI_FUNCTION_EVENT_ACK:
291                 /*  _EVENT_NOTIFICATION should NOT come down this path any more.
292                  *  Should be routed to mpt_lan_event_process(), but just in case...
293                  */
294                 FreeReqFrame = 1;
295                 break;
296
297         default:
298                 printk (KERN_ERR MYNAM "/lan_reply: Got a non-turbo "
299                         "reply that I don't know what to do with\n");
300
301                 /* CHECKME!  Hmmm...  FreeReqFrame is 0 here; is that right? */
302                 FreeReqFrame = 1;
303
304                 break;
305         }
306
307         return FreeReqFrame;
308 }
309
310 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
311 static int
312 mpt_lan_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
313 {
314         struct net_device *dev = ioc->netdev;
315         struct mpt_lan_priv *priv = netdev_priv(dev);
316
317         dlprintk((KERN_INFO MYNAM ": IOC %s_reset routed to LAN driver!\n",
318                         reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
319                         reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
320
321         if (priv->mpt_rxfidx == NULL)
322                 return (1);
323
324         if (reset_phase == MPT_IOC_SETUP_RESET) {
325                 ;
326         } else if (reset_phase == MPT_IOC_PRE_RESET) {
327                 int i;
328                 unsigned long flags;
329
330                 netif_stop_queue(dev);
331
332                 dlprintk ((KERN_INFO "mptlan/ioc_reset: called netif_stop_queue for %s.\n", dev->name));
333
334                 atomic_set(&priv->buckets_out, 0);
335
336                 /* Reset Rx Free Tail index and re-populate the queue. */
337                 spin_lock_irqsave(&priv->rxfidx_lock, flags);
338                 priv->mpt_rxfidx_tail = -1;
339                 for (i = 0; i < priv->max_buckets_out; i++)
340                         priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = i;
341                 spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
342         } else {
343                 mpt_lan_post_receive_buckets(dev);
344                 netif_wake_queue(dev);
345         }
346
347         return 1;
348 }
349
350 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
351 static int
352 mpt_lan_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
353 {
354         dlprintk((KERN_INFO MYNAM ": MPT event routed to LAN driver!\n"));
355
356         switch (le32_to_cpu(pEvReply->Event)) {
357         case MPI_EVENT_NONE:                            /* 00 */
358         case MPI_EVENT_LOG_DATA:                        /* 01 */
359         case MPI_EVENT_STATE_CHANGE:                    /* 02 */
360         case MPI_EVENT_UNIT_ATTENTION:                  /* 03 */
361         case MPI_EVENT_IOC_BUS_RESET:                   /* 04 */
362         case MPI_EVENT_EXT_BUS_RESET:                   /* 05 */
363         case MPI_EVENT_RESCAN:                          /* 06 */
364                 /* Ok, do we need to do anything here? As far as
365                    I can tell, this is when a new device gets added
366                    to the loop. */
367         case MPI_EVENT_LINK_STATUS_CHANGE:              /* 07 */
368         case MPI_EVENT_LOOP_STATE_CHANGE:               /* 08 */
369         case MPI_EVENT_LOGOUT:                          /* 09 */
370         case MPI_EVENT_EVENT_CHANGE:                    /* 0A */
371         default:
372                 break;
373         }
374
375         /*
376          *  NOTE: pEvent->AckRequired handling now done in mptbase.c;
377          *  Do NOT do it here now!
378          */
379
380         return 1;
381 }
382
383 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
384 static int
385 mpt_lan_open(struct net_device *dev)
386 {
387         struct mpt_lan_priv *priv = netdev_priv(dev);
388         int i;
389
390         if (mpt_lan_reset(dev) != 0) {
391                 MPT_ADAPTER *mpt_dev = priv->mpt_dev;
392
393                 printk (KERN_WARNING MYNAM "/lan_open: lan_reset failed.");
394
395                 if (mpt_dev->active)
396                         printk ("The ioc is active. Perhaps it needs to be"
397                                 " reset?\n");
398                 else
399                         printk ("The ioc in inactive, most likely in the "
400                                 "process of being reset. Please try again in "
401                                 "a moment.\n");
402         }
403
404         priv->mpt_txfidx = kmalloc(priv->tx_max_out * sizeof(int), GFP_KERNEL);
405         if (priv->mpt_txfidx == NULL)
406                 goto out;
407         priv->mpt_txfidx_tail = -1;
408
409         priv->SendCtl = kmalloc(priv->tx_max_out * sizeof(struct BufferControl),
410                                 GFP_KERNEL);
411         if (priv->SendCtl == NULL)
412                 goto out_mpt_txfidx;
413         for (i = 0; i < priv->tx_max_out; i++) {
414                 memset(&priv->SendCtl[i], 0, sizeof(struct BufferControl));
415                 priv->mpt_txfidx[++priv->mpt_txfidx_tail] = i;
416         }
417
418         dlprintk((KERN_INFO MYNAM "@lo: Finished initializing SendCtl\n"));
419
420         priv->mpt_rxfidx = kmalloc(priv->max_buckets_out * sizeof(int),
421                                    GFP_KERNEL);
422         if (priv->mpt_rxfidx == NULL)
423                 goto out_SendCtl;
424         priv->mpt_rxfidx_tail = -1;
425
426         priv->RcvCtl = kmalloc(priv->max_buckets_out *
427                                                 sizeof(struct BufferControl),
428                                GFP_KERNEL);
429         if (priv->RcvCtl == NULL)
430                 goto out_mpt_rxfidx;
431         for (i = 0; i < priv->max_buckets_out; i++) {
432                 memset(&priv->RcvCtl[i], 0, sizeof(struct BufferControl));
433                 priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = i;
434         }
435
436 /**/    dlprintk((KERN_INFO MYNAM "/lo: txfidx contains - "));
437 /**/    for (i = 0; i < priv->tx_max_out; i++)
438 /**/            dlprintk((" %xh", priv->mpt_txfidx[i]));
439 /**/    dlprintk(("\n"));
440
441         dlprintk((KERN_INFO MYNAM "/lo: Finished initializing RcvCtl\n"));
442
443         mpt_lan_post_receive_buckets(dev);
444         printk(KERN_INFO MYNAM ": %s/%s: interface up & active\n",
445                         IOC_AND_NETDEV_NAMES_s_s(dev));
446
447         if (mpt_event_register(LanCtx, mpt_lan_event_process) != 0) {
448                 printk (KERN_WARNING MYNAM "/lo: Unable to register for Event"
449                         " Notifications. This is a bad thing! We're not going "
450                         "to go ahead, but I'd be leery of system stability at "
451                         "this point.\n");
452         }
453
454         netif_start_queue(dev);
455         dlprintk((KERN_INFO MYNAM "/lo: Done.\n"));
456
457         return 0;
458 out_mpt_rxfidx:
459         kfree(priv->mpt_rxfidx);
460         priv->mpt_rxfidx = NULL;
461 out_SendCtl:
462         kfree(priv->SendCtl);
463         priv->SendCtl = NULL;
464 out_mpt_txfidx:
465         kfree(priv->mpt_txfidx);
466         priv->mpt_txfidx = NULL;
467 out:    return -ENOMEM;
468 }
469
470 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
471 /* Send a LanReset message to the FW. This should result in the FW returning
472    any buckets it still has. */
473 static int
474 mpt_lan_reset(struct net_device *dev)
475 {
476         MPT_FRAME_HDR *mf;
477         LANResetRequest_t *pResetReq;
478         struct mpt_lan_priv *priv = netdev_priv(dev);
479
480         mf = mpt_get_msg_frame(LanCtx, priv->mpt_dev);
481
482         if (mf == NULL) {
483 /*              dlprintk((KERN_ERR MYNAM "/reset: Evil funkiness abounds! "
484                 "Unable to allocate a request frame.\n"));
485 */
486                 return -1;
487         }
488
489         pResetReq = (LANResetRequest_t *) mf;
490
491         pResetReq->Function     = MPI_FUNCTION_LAN_RESET;
492         pResetReq->ChainOffset  = 0;
493         pResetReq->Reserved     = 0;
494         pResetReq->PortNumber   = priv->pnum;
495         pResetReq->MsgFlags     = 0;
496         pResetReq->Reserved2    = 0;
497
498         mpt_put_msg_frame(LanCtx, priv->mpt_dev, mf);
499
500         return 0;
501 }
502
503 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
504 static int
505 mpt_lan_close(struct net_device *dev)
506 {
507         struct mpt_lan_priv *priv = netdev_priv(dev);
508         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
509         unsigned int timeout;
510         int i;
511
512         dlprintk((KERN_INFO MYNAM ": mpt_lan_close called\n"));
513
514         mpt_event_deregister(LanCtx);
515
516         dlprintk((KERN_INFO MYNAM ":lan_close: Posted %d buckets "
517                   "since driver was loaded, %d still out\n",
518                   priv->total_posted,atomic_read(&priv->buckets_out)));
519
520         netif_stop_queue(dev);
521
522         mpt_lan_reset(dev);
523
524         timeout = 2 * HZ;
525         while (atomic_read(&priv->buckets_out) && --timeout) {
526                 set_current_state(TASK_INTERRUPTIBLE);
527                 schedule_timeout(1);
528         }
529
530         for (i = 0; i < priv->max_buckets_out; i++) {
531                 if (priv->RcvCtl[i].skb != NULL) {
532 /**/                    dlprintk((KERN_INFO MYNAM "/lan_close: bucket %05x "
533 /**/                              "is still out\n", i));
534                         pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[i].dma,
535                                          priv->RcvCtl[i].len,
536                                          PCI_DMA_FROMDEVICE);
537                         dev_kfree_skb(priv->RcvCtl[i].skb);
538                 }
539         }
540
541         kfree(priv->RcvCtl);
542         kfree(priv->mpt_rxfidx);
543
544         for (i = 0; i < priv->tx_max_out; i++) {
545                 if (priv->SendCtl[i].skb != NULL) {
546                         pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[i].dma,
547                                          priv->SendCtl[i].len,
548                                          PCI_DMA_TODEVICE);
549                         dev_kfree_skb(priv->SendCtl[i].skb);
550                 }
551         }
552
553         kfree(priv->SendCtl);
554         kfree(priv->mpt_txfidx);
555
556         atomic_set(&priv->buckets_out, 0);
557
558         printk(KERN_INFO MYNAM ": %s/%s: interface down & inactive\n",
559                         IOC_AND_NETDEV_NAMES_s_s(dev));
560
561         return 0;
562 }
563
564 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
565 static struct net_device_stats *
566 mpt_lan_get_stats(struct net_device *dev)
567 {
568         struct mpt_lan_priv *priv = netdev_priv(dev);
569
570         return (struct net_device_stats *) &priv->stats;
571 }
572
573 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
574 static int
575 mpt_lan_change_mtu(struct net_device *dev, int new_mtu)
576 {
577         if ((new_mtu < MPT_LAN_MIN_MTU) || (new_mtu > MPT_LAN_MAX_MTU))
578                 return -EINVAL;
579         dev->mtu = new_mtu;
580         return 0;
581 }
582
583 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
584 /* Tx timeout handler. */
585 static void
586 mpt_lan_tx_timeout(struct net_device *dev)
587 {
588         struct mpt_lan_priv *priv = netdev_priv(dev);
589         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
590
591         if (mpt_dev->active) {
592                 dlprintk (("mptlan/tx_timeout: calling netif_wake_queue for %s.\n", dev->name));
593                 netif_wake_queue(dev);
594         }
595 }
596
597 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
598 //static inline int
599 static int
600 mpt_lan_send_turbo(struct net_device *dev, u32 tmsg)
601 {
602         struct mpt_lan_priv *priv = netdev_priv(dev);
603         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
604         struct sk_buff *sent;
605         unsigned long flags;
606         u32 ctx;
607
608         ctx = GET_LAN_BUFFER_CONTEXT(tmsg);
609         sent = priv->SendCtl[ctx].skb;
610
611         priv->stats.tx_packets++;
612         priv->stats.tx_bytes += sent->len;
613
614         dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n",
615                         IOC_AND_NETDEV_NAMES_s_s(dev),
616                         __FUNCTION__, sent));
617
618         priv->SendCtl[ctx].skb = NULL;
619         pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[ctx].dma,
620                          priv->SendCtl[ctx].len, PCI_DMA_TODEVICE);
621         dev_kfree_skb_irq(sent);
622
623         spin_lock_irqsave(&priv->txfidx_lock, flags);
624         priv->mpt_txfidx[++priv->mpt_txfidx_tail] = ctx;
625         spin_unlock_irqrestore(&priv->txfidx_lock, flags);
626
627         netif_wake_queue(dev);
628         return 0;
629 }
630
631 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
632 static int
633 mpt_lan_send_reply(struct net_device *dev, LANSendReply_t *pSendRep)
634 {
635         struct mpt_lan_priv *priv = netdev_priv(dev);
636         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
637         struct sk_buff *sent;
638         unsigned long flags;
639         int FreeReqFrame = 0;
640         u32 *pContext;
641         u32 ctx;
642         u8 count;
643
644         count = pSendRep->NumberOfContexts;
645
646         dioprintk((KERN_INFO MYNAM ": send_reply: IOCStatus: %04x\n",
647                  le16_to_cpu(pSendRep->IOCStatus)));
648
649         /* Add check for Loginfo Flag in IOCStatus */
650
651         switch (le16_to_cpu(pSendRep->IOCStatus) & MPI_IOCSTATUS_MASK) {
652         case MPI_IOCSTATUS_SUCCESS:
653                 priv->stats.tx_packets += count;
654                 break;
655
656         case MPI_IOCSTATUS_LAN_CANCELED:
657         case MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED:
658                 break;
659
660         case MPI_IOCSTATUS_INVALID_SGL:
661                 priv->stats.tx_errors += count;
662                 printk (KERN_ERR MYNAM ": %s/%s: ERROR - Invalid SGL sent to IOC!\n",
663                                 IOC_AND_NETDEV_NAMES_s_s(dev));
664                 goto out;
665
666         default:
667                 priv->stats.tx_errors += count;
668                 break;
669         }
670
671         pContext = &pSendRep->BufferContext;
672
673         spin_lock_irqsave(&priv->txfidx_lock, flags);
674         while (count > 0) {
675                 ctx = GET_LAN_BUFFER_CONTEXT(le32_to_cpu(*pContext));
676
677                 sent = priv->SendCtl[ctx].skb;
678                 priv->stats.tx_bytes += sent->len;
679
680                 dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n",
681                                 IOC_AND_NETDEV_NAMES_s_s(dev),
682                                 __FUNCTION__, sent));
683
684                 priv->SendCtl[ctx].skb = NULL;
685                 pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[ctx].dma,
686                                  priv->SendCtl[ctx].len, PCI_DMA_TODEVICE);
687                 dev_kfree_skb_irq(sent);
688
689                 priv->mpt_txfidx[++priv->mpt_txfidx_tail] = ctx;
690
691                 pContext++;
692                 count--;
693         }
694         spin_unlock_irqrestore(&priv->txfidx_lock, flags);
695
696 out:
697         if (!(pSendRep->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY))
698                 FreeReqFrame = 1;
699
700         netif_wake_queue(dev);
701         return FreeReqFrame;
702 }
703
704 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
705 static int
706 mpt_lan_sdu_send (struct sk_buff *skb, struct net_device *dev)
707 {
708         struct mpt_lan_priv *priv = netdev_priv(dev);
709         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
710         MPT_FRAME_HDR *mf;
711         LANSendRequest_t *pSendReq;
712         SGETransaction32_t *pTrans;
713         SGESimple64_t *pSimple;
714         dma_addr_t dma;
715         unsigned long flags;
716         int ctx;
717         u16 cur_naa = 0x1000;
718
719         dioprintk((KERN_INFO MYNAM ": %s called, skb_addr = %p\n",
720                         __FUNCTION__, skb));
721
722         spin_lock_irqsave(&priv->txfidx_lock, flags);
723         if (priv->mpt_txfidx_tail < 0) {
724                 netif_stop_queue(dev);
725                 spin_unlock_irqrestore(&priv->txfidx_lock, flags);
726
727                 printk (KERN_ERR "%s: no tx context available: %u\n",
728                         __FUNCTION__, priv->mpt_txfidx_tail);
729                 return 1;
730         }
731
732         mf = mpt_get_msg_frame(LanCtx, mpt_dev);
733         if (mf == NULL) {
734                 netif_stop_queue(dev);
735                 spin_unlock_irqrestore(&priv->txfidx_lock, flags);
736
737                 printk (KERN_ERR "%s: Unable to alloc request frame\n",
738                         __FUNCTION__);
739                 return 1;
740         }
741
742         ctx = priv->mpt_txfidx[priv->mpt_txfidx_tail--];
743         spin_unlock_irqrestore(&priv->txfidx_lock, flags);
744
745 //      dioprintk((KERN_INFO MYNAM ": %s/%s: Creating new msg frame (send).\n",
746 //                      IOC_AND_NETDEV_NAMES_s_s(dev)));
747
748         pSendReq = (LANSendRequest_t *) mf;
749
750         /* Set the mac.raw pointer, since this apparently isn't getting
751          * done before we get the skb. Pull the data pointer past the mac data.
752          */
753         skb->mac.raw = skb->data;
754         skb_pull(skb, 12);
755
756         dma = pci_map_single(mpt_dev->pcidev, skb->data, skb->len,
757                              PCI_DMA_TODEVICE);
758
759         priv->SendCtl[ctx].skb = skb;
760         priv->SendCtl[ctx].dma = dma;
761         priv->SendCtl[ctx].len = skb->len;
762
763         /* Message Header */
764         pSendReq->Reserved    = 0;
765         pSendReq->Function    = MPI_FUNCTION_LAN_SEND;
766         pSendReq->ChainOffset = 0;
767         pSendReq->Reserved2   = 0;
768         pSendReq->MsgFlags    = 0;
769         pSendReq->PortNumber  = priv->pnum;
770
771         /* Transaction Context Element */
772         pTrans = (SGETransaction32_t *) pSendReq->SG_List;
773
774         /* No Flags, 8 bytes of Details, 32bit Context (bloody turbo replies) */
775         pTrans->ContextSize   = sizeof(u32);
776         pTrans->DetailsLength = 2 * sizeof(u32);
777         pTrans->Flags         = 0;
778         pTrans->TransactionContext[0] = cpu_to_le32(ctx);
779
780 //      dioprintk((KERN_INFO MYNAM ": %s/%s: BC = %08x, skb = %p, buff = %p\n",
781 //                      IOC_AND_NETDEV_NAMES_s_s(dev),
782 //                      ctx, skb, skb->data));
783
784 #ifdef QLOGIC_NAA_WORKAROUND
785 {
786         struct NAA_Hosed *nh;
787
788         /* Munge the NAA for Tx packets to QLogic boards, which don't follow
789            RFC 2625. The longer I look at this, the more my opinion of Qlogic
790            drops. */
791         read_lock_irq(&bad_naa_lock);
792         for (nh = mpt_bad_naa; nh != NULL; nh=nh->next) {
793                 if ((nh->ieee[0] == skb->mac.raw[0]) &&
794                     (nh->ieee[1] == skb->mac.raw[1]) &&
795                     (nh->ieee[2] == skb->mac.raw[2]) &&
796                     (nh->ieee[3] == skb->mac.raw[3]) &&
797                     (nh->ieee[4] == skb->mac.raw[4]) &&
798                     (nh->ieee[5] == skb->mac.raw[5])) {
799                         cur_naa = nh->NAA;
800                         dlprintk ((KERN_INFO "mptlan/sdu_send: using NAA value "
801                                   "= %04x.\n", cur_naa));
802                         break;
803                 }
804         }
805         read_unlock_irq(&bad_naa_lock);
806 }
807 #endif
808
809         pTrans->TransactionDetails[0] = cpu_to_le32((cur_naa         << 16) |
810                                                     (skb->mac.raw[0] <<  8) |
811                                                     (skb->mac.raw[1] <<  0));
812         pTrans->TransactionDetails[1] = cpu_to_le32((skb->mac.raw[2] << 24) |
813                                                     (skb->mac.raw[3] << 16) |
814                                                     (skb->mac.raw[4] <<  8) |
815                                                     (skb->mac.raw[5] <<  0));
816
817         pSimple = (SGESimple64_t *) &pTrans->TransactionDetails[2];
818
819         /* If we ever decide to send more than one Simple SGE per LANSend, then
820            we will need to make sure that LAST_ELEMENT only gets set on the
821            last one. Otherwise, bad voodoo and evil funkiness will commence. */
822         pSimple->FlagsLength = cpu_to_le32(
823                         ((MPI_SGE_FLAGS_LAST_ELEMENT |
824                           MPI_SGE_FLAGS_END_OF_BUFFER |
825                           MPI_SGE_FLAGS_SIMPLE_ELEMENT |
826                           MPI_SGE_FLAGS_SYSTEM_ADDRESS |
827                           MPI_SGE_FLAGS_HOST_TO_IOC |
828                           MPI_SGE_FLAGS_64_BIT_ADDRESSING |
829                           MPI_SGE_FLAGS_END_OF_LIST) << MPI_SGE_FLAGS_SHIFT) |
830                         skb->len);
831         pSimple->Address.Low = cpu_to_le32((u32) dma);
832         if (sizeof(dma_addr_t) > sizeof(u32))
833                 pSimple->Address.High = cpu_to_le32((u32) ((u64) dma >> 32));
834         else
835                 pSimple->Address.High = 0;
836
837         mpt_put_msg_frame (LanCtx, mpt_dev, mf);
838         dev->trans_start = jiffies;
839
840         dioprintk((KERN_INFO MYNAM ": %s/%s: Sending packet. FlagsLength = %08x.\n",
841                         IOC_AND_NETDEV_NAMES_s_s(dev),
842                         le32_to_cpu(pSimple->FlagsLength)));
843
844         return 0;
845 }
846
847 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
848 static inline void
849 mpt_lan_wake_post_buckets_task(struct net_device *dev, int priority)
850 /*
851  * @priority: 0 = put it on the timer queue, 1 = put it on the immediate queue
852  */
853 {
854         struct mpt_lan_priv *priv = dev->priv;
855         
856         if (test_and_set_bit(0, &priv->post_buckets_active) == 0) {
857                 if (priority) {
858                         schedule_work(&priv->post_buckets_task);
859                 } else {
860                         schedule_delayed_work(&priv->post_buckets_task, 1);
861                         dioprintk((KERN_INFO MYNAM ": post_buckets queued on "
862                                    "timer.\n"));
863                 }
864                 dioprintk((KERN_INFO MYNAM ": %s/%s: Queued post_buckets task.\n",
865                            IOC_AND_NETDEV_NAMES_s_s(dev) ));
866         }
867 }
868
869 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
870 static inline int
871 mpt_lan_receive_skb(struct net_device *dev, struct sk_buff *skb)
872 {
873         struct mpt_lan_priv *priv = dev->priv;
874
875         skb->protocol = mpt_lan_type_trans(skb, dev);
876
877         dioprintk((KERN_INFO MYNAM ": %s/%s: Incoming packet (%d bytes) "
878                  "delivered to upper level.\n",
879                         IOC_AND_NETDEV_NAMES_s_s(dev), skb->len));
880
881         priv->stats.rx_bytes += skb->len;
882         priv->stats.rx_packets++;
883
884         skb->dev = dev;
885         netif_rx(skb);
886
887         dioprintk((MYNAM "/receive_skb: %d buckets remaining\n",
888                  atomic_read(&priv->buckets_out)));
889
890         if (atomic_read(&priv->buckets_out) < priv->bucketthresh)
891                 mpt_lan_wake_post_buckets_task(dev, 1);
892
893         dioprintk((KERN_INFO MYNAM "/receive_post_reply: %d buckets "
894                   "remaining, %d received back since sod\n",
895                   atomic_read(&priv->buckets_out), priv->total_received));
896
897         return 0;
898 }
899
900 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
901 //static inline int
902 static int
903 mpt_lan_receive_post_turbo(struct net_device *dev, u32 tmsg)
904 {
905         struct mpt_lan_priv *priv = dev->priv;
906         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
907         struct sk_buff *skb, *old_skb;
908         unsigned long flags;
909         u32 ctx, len;
910
911         ctx = GET_LAN_BUCKET_CONTEXT(tmsg);
912         skb = priv->RcvCtl[ctx].skb;
913
914         len = GET_LAN_PACKET_LENGTH(tmsg);
915
916         if (len < MPT_LAN_RX_COPYBREAK) {
917                 old_skb = skb;
918
919                 skb = (struct sk_buff *)dev_alloc_skb(len);
920                 if (!skb) {
921                         printk (KERN_ERR MYNAM ": %s/%s: ERROR - Can't allocate skb! (%s@%d)\n",
922                                         IOC_AND_NETDEV_NAMES_s_s(dev),
923                                         __FILE__, __LINE__);
924                         return -ENOMEM;
925                 }
926
927                 pci_dma_sync_single_for_cpu(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
928                                             priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
929
930                 memcpy(skb_put(skb, len), old_skb->data, len);
931
932                 pci_dma_sync_single_for_device(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
933                                                priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
934                 goto out;
935         }
936
937         skb_put(skb, len);
938
939         priv->RcvCtl[ctx].skb = NULL;
940
941         pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
942                          priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
943
944 out:
945         spin_lock_irqsave(&priv->rxfidx_lock, flags);
946         priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
947         spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
948
949         atomic_dec(&priv->buckets_out);
950         priv->total_received++;
951
952         return mpt_lan_receive_skb(dev, skb);
953 }
954
955 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
956 static int
957 mpt_lan_receive_post_free(struct net_device *dev,
958                           LANReceivePostReply_t *pRecvRep)
959 {
960         struct mpt_lan_priv *priv = dev->priv;
961         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
962         unsigned long flags;
963         struct sk_buff *skb;
964         u32 ctx;
965         int count;
966         int i;
967
968         count = pRecvRep->NumberOfContexts;
969
970 /**/    dlprintk((KERN_INFO MYNAM "/receive_post_reply: "
971                   "IOC returned %d buckets, freeing them...\n", count));
972
973         spin_lock_irqsave(&priv->rxfidx_lock, flags);
974         for (i = 0; i < count; i++) {
975                 ctx = le32_to_cpu(pRecvRep->BucketContext[i]);
976
977                 skb = priv->RcvCtl[ctx].skb;
978
979 //              dlprintk((KERN_INFO MYNAM ": %s: dev_name = %s\n",
980 //                              IOC_AND_NETDEV_NAMES_s_s(dev)));
981 //              dlprintk((KERN_INFO MYNAM "@rpr[2], priv = %p, buckets_out addr = %p",
982 //                              priv, &(priv->buckets_out)));
983 //              dlprintk((KERN_INFO MYNAM "@rpr[2] TC + 3\n"));
984
985                 priv->RcvCtl[ctx].skb = NULL;
986                 pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
987                                  priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
988                 dev_kfree_skb_any(skb);
989
990                 priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
991         }
992         spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
993
994         atomic_sub(count, &priv->buckets_out);
995
996 //      for (i = 0; i < priv->max_buckets_out; i++)
997 //              if (priv->RcvCtl[i].skb != NULL)
998 //                      dlprintk((KERN_INFO MYNAM "@rpr: bucket %03x "
999 //                                "is still out\n", i));
1000
1001 /*      dlprintk((KERN_INFO MYNAM "/receive_post_reply: freed %d buckets\n",
1002                   count));
1003 */
1004 /**/    dlprintk((KERN_INFO MYNAM "@receive_post_reply: %d buckets "
1005 /**/              "remaining, %d received back since sod.\n",
1006 /**/              atomic_read(&priv->buckets_out), priv->total_received));
1007         return 0;
1008 }
1009
1010 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1011 static int
1012 mpt_lan_receive_post_reply(struct net_device *dev,
1013                            LANReceivePostReply_t *pRecvRep)
1014 {
1015         struct mpt_lan_priv *priv = dev->priv;
1016         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
1017         struct sk_buff *skb, *old_skb;
1018         unsigned long flags;
1019         u32 len, ctx, offset;
1020         u32 remaining = le32_to_cpu(pRecvRep->BucketsRemaining);
1021         int count;
1022         int i, l;
1023
1024         dioprintk((KERN_INFO MYNAM ": mpt_lan_receive_post_reply called\n"));
1025         dioprintk((KERN_INFO MYNAM ": receive_post_reply: IOCStatus: %04x\n",
1026                  le16_to_cpu(pRecvRep->IOCStatus)));
1027
1028         if ((le16_to_cpu(pRecvRep->IOCStatus) & MPI_IOCSTATUS_MASK) ==
1029                                                 MPI_IOCSTATUS_LAN_CANCELED)
1030                 return mpt_lan_receive_post_free(dev, pRecvRep);
1031
1032         len = le32_to_cpu(pRecvRep->PacketLength);
1033         if (len == 0) {
1034                 printk (KERN_ERR MYNAM ": %s/%s: ERROR - Got a non-TURBO "
1035                         "ReceivePostReply w/ PacketLength zero!\n",
1036                                 IOC_AND_NETDEV_NAMES_s_s(dev));
1037                 printk (KERN_ERR MYNAM ": MsgFlags = %02x, IOCStatus = %04x\n",
1038                                 pRecvRep->MsgFlags, le16_to_cpu(pRecvRep->IOCStatus));
1039                 return -1;
1040         }
1041
1042         ctx    = le32_to_cpu(pRecvRep->BucketContext[0]);
1043         count  = pRecvRep->NumberOfContexts;
1044         skb    = priv->RcvCtl[ctx].skb;
1045
1046         offset = le32_to_cpu(pRecvRep->PacketOffset);
1047 //      if (offset != 0) {
1048 //              printk (KERN_INFO MYNAM ": %s/%s: Got a ReceivePostReply "
1049 //                      "w/ PacketOffset %u\n",
1050 //                              IOC_AND_NETDEV_NAMES_s_s(dev),
1051 //                              offset);
1052 //      }
1053
1054         dioprintk((KERN_INFO MYNAM ": %s/%s: @rpr, offset = %d, len = %d\n",
1055                         IOC_AND_NETDEV_NAMES_s_s(dev),
1056                         offset, len));
1057
1058         if (count > 1) {
1059                 int szrem = len;
1060
1061 //              dioprintk((KERN_INFO MYNAM ": %s/%s: Multiple buckets returned "
1062 //                      "for single packet, concatenating...\n",
1063 //                              IOC_AND_NETDEV_NAMES_s_s(dev)));
1064
1065                 skb = (struct sk_buff *)dev_alloc_skb(len);
1066                 if (!skb) {
1067                         printk (KERN_ERR MYNAM ": %s/%s: ERROR - Can't allocate skb! (%s@%d)\n",
1068                                         IOC_AND_NETDEV_NAMES_s_s(dev),
1069                                         __FILE__, __LINE__);
1070                         return -ENOMEM;
1071                 }
1072
1073                 spin_lock_irqsave(&priv->rxfidx_lock, flags);
1074                 for (i = 0; i < count; i++) {
1075
1076                         ctx = le32_to_cpu(pRecvRep->BucketContext[i]);
1077                         old_skb = priv->RcvCtl[ctx].skb;
1078
1079                         l = priv->RcvCtl[ctx].len;
1080                         if (szrem < l)
1081                                 l = szrem;
1082
1083 //                      dioprintk((KERN_INFO MYNAM ": %s/%s: Buckets = %d, len = %u\n",
1084 //                                      IOC_AND_NETDEV_NAMES_s_s(dev),
1085 //                                      i, l));
1086
1087                         pci_dma_sync_single_for_cpu(mpt_dev->pcidev,
1088                                                     priv->RcvCtl[ctx].dma,
1089                                                     priv->RcvCtl[ctx].len,
1090                                                     PCI_DMA_FROMDEVICE);
1091                         memcpy(skb_put(skb, l), old_skb->data, l);
1092
1093                         pci_dma_sync_single_for_device(mpt_dev->pcidev,
1094                                                        priv->RcvCtl[ctx].dma,
1095                                                        priv->RcvCtl[ctx].len,
1096                                                        PCI_DMA_FROMDEVICE);
1097
1098                         priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1099                         szrem -= l;
1100                 }
1101                 spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1102
1103         } else if (len < MPT_LAN_RX_COPYBREAK) {
1104
1105                 old_skb = skb;
1106
1107                 skb = (struct sk_buff *)dev_alloc_skb(len);
1108                 if (!skb) {
1109                         printk (KERN_ERR MYNAM ": %s/%s: ERROR - Can't allocate skb! (%s@%d)\n",
1110                                         IOC_AND_NETDEV_NAMES_s_s(dev),
1111                                         __FILE__, __LINE__);
1112                         return -ENOMEM;
1113                 }
1114
1115                 pci_dma_sync_single_for_cpu(mpt_dev->pcidev,
1116                                             priv->RcvCtl[ctx].dma,
1117                                             priv->RcvCtl[ctx].len,
1118                                             PCI_DMA_FROMDEVICE);
1119
1120                 memcpy(skb_put(skb, len), old_skb->data, len);
1121
1122                 pci_dma_sync_single_for_device(mpt_dev->pcidev,
1123                                                priv->RcvCtl[ctx].dma,
1124                                                priv->RcvCtl[ctx].len,
1125                                                PCI_DMA_FROMDEVICE);
1126
1127                 spin_lock_irqsave(&priv->rxfidx_lock, flags);
1128                 priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1129                 spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1130
1131         } else {
1132                 spin_lock_irqsave(&priv->rxfidx_lock, flags);
1133
1134                 priv->RcvCtl[ctx].skb = NULL;
1135
1136                 pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
1137                                  priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
1138                 priv->RcvCtl[ctx].dma = 0;
1139
1140                 priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1141                 spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1142
1143                 skb_put(skb,len);
1144         }
1145
1146         atomic_sub(count, &priv->buckets_out);
1147         priv->total_received += count;
1148
1149         if (priv->mpt_rxfidx_tail >= MPT_LAN_MAX_BUCKETS_OUT) {
1150                 printk (KERN_ERR MYNAM ": %s/%s: Yoohoo! mpt_rxfidx_tail = %d, "
1151                         "MPT_LAN_MAX_BUCKETS_OUT = %d\n",
1152                                 IOC_AND_NETDEV_NAMES_s_s(dev),
1153                                 priv->mpt_rxfidx_tail,
1154                                 MPT_LAN_MAX_BUCKETS_OUT);
1155
1156                 panic("Damn it Jim! I'm a doctor, not a programmer! "
1157                                 "Oh, wait a sec, I am a programmer. "
1158                                 "And, who's Jim?!?!\n"
1159                                 "Arrgghh! We've done it again!\n");
1160         }
1161
1162         if (remaining == 0)
1163                 printk (KERN_WARNING MYNAM ": %s/%s: WARNING - IOC out of buckets! "
1164                         "(priv->buckets_out = %d)\n",
1165                         IOC_AND_NETDEV_NAMES_s_s(dev),
1166                         atomic_read(&priv->buckets_out));
1167         else if (remaining < 10)
1168                 printk (KERN_INFO MYNAM ": %s/%s: IOC says %d buckets left. "
1169                         "(priv->buckets_out = %d)\n",
1170                         IOC_AND_NETDEV_NAMES_s_s(dev),
1171                         remaining, atomic_read(&priv->buckets_out));
1172         
1173         if ((remaining < priv->bucketthresh) &&
1174             ((atomic_read(&priv->buckets_out) - remaining) >
1175              MPT_LAN_BUCKETS_REMAIN_MISMATCH_THRESH)) {
1176                 
1177                 printk (KERN_WARNING MYNAM " Mismatch between driver's "
1178                         "buckets_out count and fw's BucketsRemaining "
1179                         "count has crossed the threshold, issuing a "
1180                         "LanReset to clear the fw's hashtable. You may "
1181                         "want to check your /var/log/messages for \"CRC "
1182                         "error\" event notifications.\n");
1183                 
1184                 mpt_lan_reset(dev);
1185                 mpt_lan_wake_post_buckets_task(dev, 0);
1186         }
1187         
1188         return mpt_lan_receive_skb(dev, skb);
1189 }
1190
1191 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1192 /* Simple SGE's only at the moment */
1193
1194 static void
1195 mpt_lan_post_receive_buckets(void *dev_id)
1196 {
1197         struct net_device *dev = dev_id;
1198         struct mpt_lan_priv *priv = dev->priv;
1199         MPT_ADAPTER *mpt_dev = priv->mpt_dev;
1200         MPT_FRAME_HDR *mf;
1201         LANReceivePostRequest_t *pRecvReq;
1202         SGETransaction32_t *pTrans;
1203         SGESimple64_t *pSimple;
1204         struct sk_buff *skb;
1205         dma_addr_t dma;
1206         u32 curr, buckets, count, max;
1207         u32 len = (dev->mtu + dev->hard_header_len + 4);
1208         unsigned long flags;
1209         int i;
1210
1211         curr = atomic_read(&priv->buckets_out);
1212         buckets = (priv->max_buckets_out - curr);
1213
1214         dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, Start_buckets = %u, buckets_out = %u\n",
1215                         IOC_AND_NETDEV_NAMES_s_s(dev),
1216                         __FUNCTION__, buckets, curr));
1217
1218         max = (mpt_dev->req_sz - MPT_LAN_RECEIVE_POST_REQUEST_SIZE) /
1219                         (MPT_LAN_TRANSACTION32_SIZE + sizeof(SGESimple64_t));
1220
1221         while (buckets) {
1222                 mf = mpt_get_msg_frame(LanCtx, mpt_dev);
1223                 if (mf == NULL) {
1224                         printk (KERN_ERR "%s: Unable to alloc request frame\n",
1225                                 __FUNCTION__);
1226                         dioprintk((KERN_ERR "%s: %u buckets remaining\n",
1227                                  __FUNCTION__, buckets));
1228                         goto out;
1229                 }
1230                 pRecvReq = (LANReceivePostRequest_t *) mf;
1231
1232                 count = buckets;
1233                 if (count > max)
1234                         count = max;
1235
1236                 pRecvReq->Function    = MPI_FUNCTION_LAN_RECEIVE;
1237                 pRecvReq->ChainOffset = 0;
1238                 pRecvReq->MsgFlags    = 0;
1239                 pRecvReq->PortNumber  = priv->pnum;
1240
1241                 pTrans = (SGETransaction32_t *) pRecvReq->SG_List;
1242                 pSimple = NULL;
1243
1244                 for (i = 0; i < count; i++) {
1245                         int ctx;
1246
1247                         spin_lock_irqsave(&priv->rxfidx_lock, flags);
1248                         if (priv->mpt_rxfidx_tail < 0) {
1249                                 printk (KERN_ERR "%s: Can't alloc context\n",
1250                                         __FUNCTION__);
1251                                 spin_unlock_irqrestore(&priv->rxfidx_lock,
1252                                                        flags);
1253                                 break;
1254                         }
1255
1256                         ctx = priv->mpt_rxfidx[priv->mpt_rxfidx_tail--];
1257
1258                         skb = priv->RcvCtl[ctx].skb;
1259                         if (skb && (priv->RcvCtl[ctx].len != len)) {
1260                                 pci_unmap_single(mpt_dev->pcidev,
1261                                                  priv->RcvCtl[ctx].dma,
1262                                                  priv->RcvCtl[ctx].len,
1263                                                  PCI_DMA_FROMDEVICE);
1264                                 dev_kfree_skb(priv->RcvCtl[ctx].skb);
1265                                 skb = priv->RcvCtl[ctx].skb = NULL;
1266                         }
1267
1268                         if (skb == NULL) {
1269                                 skb = dev_alloc_skb(len);
1270                                 if (skb == NULL) {
1271                                         printk (KERN_WARNING
1272                                                 MYNAM "/%s: Can't alloc skb\n",
1273                                                 __FUNCTION__);
1274                                         priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1275                                         spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1276                                         break;
1277                                 }
1278
1279                                 dma = pci_map_single(mpt_dev->pcidev, skb->data,
1280                                                      len, PCI_DMA_FROMDEVICE);
1281
1282                                 priv->RcvCtl[ctx].skb = skb;
1283                                 priv->RcvCtl[ctx].dma = dma;
1284                                 priv->RcvCtl[ctx].len = len;
1285                         }
1286
1287                         spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1288
1289                         pTrans->ContextSize   = sizeof(u32);
1290                         pTrans->DetailsLength = 0;
1291                         pTrans->Flags         = 0;
1292                         pTrans->TransactionContext[0] = cpu_to_le32(ctx);
1293
1294                         pSimple = (SGESimple64_t *) pTrans->TransactionDetails;
1295
1296                         pSimple->FlagsLength = cpu_to_le32(
1297                                 ((MPI_SGE_FLAGS_END_OF_BUFFER |
1298                                   MPI_SGE_FLAGS_SIMPLE_ELEMENT |
1299                                   MPI_SGE_FLAGS_64_BIT_ADDRESSING) << MPI_SGE_FLAGS_SHIFT) | len);
1300                         pSimple->Address.Low = cpu_to_le32((u32) priv->RcvCtl[ctx].dma);
1301                         if (sizeof(dma_addr_t) > sizeof(u32))
1302                                 pSimple->Address.High = cpu_to_le32((u32) ((u64) priv->RcvCtl[ctx].dma >> 32));
1303                         else
1304                                 pSimple->Address.High = 0;
1305
1306                         pTrans = (SGETransaction32_t *) (pSimple + 1);
1307                 }
1308
1309                 if (pSimple == NULL) {
1310 /**/                    printk (KERN_WARNING MYNAM "/%s: No buckets posted\n",
1311 /**/                            __FUNCTION__);
1312                         mpt_free_msg_frame(mpt_dev, mf);
1313                         goto out;
1314                 }
1315
1316                 pSimple->FlagsLength |= cpu_to_le32(MPI_SGE_FLAGS_END_OF_LIST << MPI_SGE_FLAGS_SHIFT);
1317
1318                 pRecvReq->BucketCount = cpu_to_le32(i);
1319
1320 /*      printk(KERN_INFO MYNAM ": posting buckets\n   ");
1321  *      for (i = 0; i < j + 2; i ++)
1322  *          printk (" %08x", le32_to_cpu(msg[i]));
1323  *      printk ("\n");
1324  */
1325
1326                 mpt_put_msg_frame(LanCtx, mpt_dev, mf);
1327
1328                 priv->total_posted += i;
1329                 buckets -= i;
1330                 atomic_add(i, &priv->buckets_out);
1331         }
1332
1333 out:
1334         dioprintk((KERN_INFO MYNAM "/%s: End_buckets = %u, priv->buckets_out = %u\n",
1335                   __FUNCTION__, buckets, atomic_read(&priv->buckets_out)));
1336         dioprintk((KERN_INFO MYNAM "/%s: Posted %u buckets and received %u back\n",
1337         __FUNCTION__, priv->total_posted, priv->total_received));
1338
1339         clear_bit(0, &priv->post_buckets_active);
1340 }
1341
1342 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1343 static struct net_device *
1344 mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)
1345 {
1346         struct net_device *dev = alloc_fcdev(sizeof(struct mpt_lan_priv));
1347         struct mpt_lan_priv *priv = NULL;
1348         u8 HWaddr[FC_ALEN], *a;
1349
1350         if (!dev)
1351                 return NULL;
1352
1353         dev->mtu = MPT_LAN_MTU;
1354
1355         priv = netdev_priv(dev);
1356
1357         priv->mpt_dev = mpt_dev;
1358         priv->pnum = pnum;
1359
1360         memset(&priv->post_buckets_task, 0, sizeof(struct work_struct));
1361         INIT_WORK(&priv->post_buckets_task, mpt_lan_post_receive_buckets, dev);
1362         priv->post_buckets_active = 0;
1363
1364         dlprintk((KERN_INFO MYNAM "@%d: bucketlen = %d\n",
1365                         __LINE__, dev->mtu + dev->hard_header_len + 4));
1366
1367         atomic_set(&priv->buckets_out, 0);
1368         priv->total_posted = 0;
1369         priv->total_received = 0;
1370         priv->max_buckets_out = max_buckets_out;
1371         if (mpt_dev->pfacts[0].MaxLanBuckets < max_buckets_out)
1372                 priv->max_buckets_out = mpt_dev->pfacts[0].MaxLanBuckets;
1373
1374         dlprintk((KERN_INFO MYNAM "@%d: MaxLanBuckets=%d, max_buckets_out/priv=%d/%d\n",
1375                         __LINE__,
1376                         mpt_dev->pfacts[0].MaxLanBuckets,
1377                         max_buckets_out,
1378                         priv->max_buckets_out));
1379
1380         priv->bucketthresh = priv->max_buckets_out * 2 / 3;
1381         spin_lock_init(&priv->txfidx_lock);
1382         spin_lock_init(&priv->rxfidx_lock);
1383
1384         memset(&priv->stats, 0, sizeof(priv->stats));
1385
1386         /*  Grab pre-fetched LANPage1 stuff. :-) */
1387         a = (u8 *) &mpt_dev->lan_cnfg_page1.HardwareAddressLow;
1388
1389         HWaddr[0] = a[5];
1390         HWaddr[1] = a[4];
1391         HWaddr[2] = a[3];
1392         HWaddr[3] = a[2];
1393         HWaddr[4] = a[1];
1394         HWaddr[5] = a[0];
1395
1396         dev->addr_len = FC_ALEN;
1397         memcpy(dev->dev_addr, HWaddr, FC_ALEN);
1398         memset(dev->broadcast, 0xff, FC_ALEN);
1399
1400         /* The Tx queue is 127 deep on the 909.
1401          * Give ourselves some breathing room.
1402          */
1403         priv->tx_max_out = (tx_max_out_p <= MPT_TX_MAX_OUT_LIM) ?
1404                             tx_max_out_p : MPT_TX_MAX_OUT_LIM;
1405
1406         dev->open = mpt_lan_open;
1407         dev->stop = mpt_lan_close;
1408         dev->get_stats = mpt_lan_get_stats;
1409         dev->set_multicast_list = NULL;
1410         dev->change_mtu = mpt_lan_change_mtu;
1411         dev->hard_start_xmit = mpt_lan_sdu_send;
1412
1413 /* Not in 2.3.42. Need 2.3.45+ */
1414         dev->tx_timeout = mpt_lan_tx_timeout;
1415         dev->watchdog_timeo = MPT_LAN_TX_TIMEOUT;
1416
1417         dlprintk((KERN_INFO MYNAM ": Finished registering dev "
1418                 "and setting initial values\n"));
1419
1420         SET_MODULE_OWNER(dev);
1421
1422         if (register_netdev(dev) != 0) {
1423                 free_netdev(dev);
1424                 dev = NULL;
1425         }
1426         return dev;
1427 }
1428
1429 static int
1430 mptlan_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1431 {
1432         MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
1433         struct net_device       *dev;
1434         int                     i;
1435
1436         for (i = 0; i < ioc->facts.NumberOfPorts; i++) {
1437                 printk(KERN_INFO MYNAM ": %s: PortNum=%x, "
1438                        "ProtocolFlags=%02Xh (%c%c%c%c)\n",
1439                        ioc->name, ioc->pfacts[i].PortNumber,
1440                        ioc->pfacts[i].ProtocolFlags,
1441                        MPT_PROTOCOL_FLAGS_c_c_c_c(
1442                                ioc->pfacts[i].ProtocolFlags));
1443
1444                 if (!(ioc->pfacts[i].ProtocolFlags &
1445                                         MPI_PORTFACTS_PROTOCOL_LAN)) {
1446                         printk(KERN_INFO MYNAM ": %s: Hmmm... LAN protocol "
1447                                "seems to be disabled on this adapter port!\n",
1448                                ioc->name);
1449                         continue;
1450                 }
1451
1452                 dev = mpt_register_lan_device(ioc, i);
1453                 if (!dev) {
1454                         printk(KERN_ERR MYNAM ": %s: Unable to register "
1455                                "port%d as a LAN device\n", ioc->name,
1456                                ioc->pfacts[i].PortNumber);
1457                         continue;
1458                 }
1459                 
1460                 printk(KERN_INFO MYNAM ": %s: Fusion MPT LAN device "
1461                        "registered as '%s'\n", ioc->name, dev->name);
1462                 printk(KERN_INFO MYNAM ": %s/%s: "
1463                        "LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n",
1464                        IOC_AND_NETDEV_NAMES_s_s(dev),
1465                        dev->dev_addr[0], dev->dev_addr[1],
1466                        dev->dev_addr[2], dev->dev_addr[3],
1467                        dev->dev_addr[4], dev->dev_addr[5]);
1468         
1469                 ioc->netdev = dev;
1470
1471                 return 0;
1472         }
1473
1474         return -ENODEV;
1475 }
1476
1477 static void
1478 mptlan_remove(struct pci_dev *pdev)
1479 {
1480         MPT_ADAPTER             *ioc = pci_get_drvdata(pdev);
1481         struct net_device       *dev = ioc->netdev;
1482
1483         if(dev != NULL) {
1484                 unregister_netdev(dev);
1485                 free_netdev(dev);
1486         }
1487 }
1488
1489 static struct mpt_pci_driver mptlan_driver = {
1490         .probe          = mptlan_probe,
1491         .remove         = mptlan_remove,
1492 };
1493
1494 static int __init mpt_lan_init (void)
1495 {
1496         show_mptmod_ver(LANAME, LANVER);
1497
1498         if ((LanCtx = mpt_register(lan_reply, MPTLAN_DRIVER)) <= 0) {
1499                 printk (KERN_ERR MYNAM ": Failed to register with MPT base driver\n");
1500                 return -EBUSY;
1501         }
1502
1503         /* Set the callback index to be used by driver core for turbo replies */
1504         mpt_lan_index = LanCtx;
1505
1506         dlprintk((KERN_INFO MYNAM ": assigned context of %d\n", LanCtx));
1507
1508         if (mpt_reset_register(LanCtx, mpt_lan_ioc_reset)) {
1509                 printk(KERN_ERR MYNAM ": Eieee! unable to register a reset "
1510                        "handler with mptbase! The world is at an end! "
1511                        "Everything is fading to black! Goodbye.\n");
1512                 return -EBUSY;
1513         }
1514
1515         dlprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n"));
1516         
1517         if (mpt_device_driver_register(&mptlan_driver, MPTLAN_DRIVER))
1518                 dprintk((KERN_INFO MYNAM ": failed to register dd callbacks\n"));
1519         return 0;
1520 }
1521
1522 static void __exit mpt_lan_exit(void)
1523 {
1524         mpt_device_driver_deregister(MPTLAN_DRIVER);
1525         mpt_reset_deregister(LanCtx);
1526
1527         if (LanCtx >= 0) {
1528                 mpt_deregister(LanCtx);
1529                 LanCtx = -1;
1530                 mpt_lan_index = 0;
1531         }
1532 }
1533
1534 module_init(mpt_lan_init);
1535 module_exit(mpt_lan_exit);
1536
1537 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1538 static unsigned short
1539 mpt_lan_type_trans(struct sk_buff *skb, struct net_device *dev)
1540 {
1541         struct mpt_lan_ohdr *fch = (struct mpt_lan_ohdr *)skb->data;
1542         struct fcllc *fcllc;
1543
1544         skb->mac.raw = skb->data;
1545         skb_pull(skb, sizeof(struct mpt_lan_ohdr));
1546
1547         if (fch->dtype == htons(0xffff)) {
1548                 u32 *p = (u32 *) fch;
1549
1550                 swab32s(p + 0);
1551                 swab32s(p + 1);
1552                 swab32s(p + 2);
1553                 swab32s(p + 3);
1554
1555                 printk (KERN_WARNING MYNAM ": %s: WARNING - Broadcast swap F/W bug detected!\n",
1556                                 NETDEV_PTR_TO_IOC_NAME_s(dev));
1557                 printk (KERN_WARNING MYNAM ": Please update sender @ MAC_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
1558                                 fch->saddr[0], fch->saddr[1], fch->saddr[2],
1559                                 fch->saddr[3], fch->saddr[4], fch->saddr[5]);
1560         }
1561
1562         if (*fch->daddr & 1) {
1563                 if (!memcmp(fch->daddr, dev->broadcast, FC_ALEN)) {
1564                         skb->pkt_type = PACKET_BROADCAST;
1565                 } else {
1566                         skb->pkt_type = PACKET_MULTICAST;
1567                 }
1568         } else {
1569                 if (memcmp(fch->daddr, dev->dev_addr, FC_ALEN)) {
1570                         skb->pkt_type = PACKET_OTHERHOST;
1571                 } else {
1572                         skb->pkt_type = PACKET_HOST;
1573                 }
1574         }
1575
1576         fcllc = (struct fcllc *)skb->data;
1577
1578 #ifdef QLOGIC_NAA_WORKAROUND
1579 {
1580         u16 source_naa = fch->stype, found = 0;
1581
1582         /* Workaround for QLogic not following RFC 2625 in regards to the NAA
1583            value. */
1584
1585         if ((source_naa & 0xF000) == 0)
1586                 source_naa = swab16(source_naa);
1587
1588         if (fcllc->ethertype == htons(ETH_P_ARP))
1589             dlprintk ((KERN_INFO "mptlan/type_trans: got arp req/rep w/ naa of "
1590                       "%04x.\n", source_naa));
1591
1592         if ((fcllc->ethertype == htons(ETH_P_ARP)) &&
1593            ((source_naa >> 12) !=  MPT_LAN_NAA_RFC2625)){
1594                 struct NAA_Hosed *nh, *prevnh;
1595                 int i;
1596
1597                 dlprintk ((KERN_INFO "mptlan/type_trans: ARP Req/Rep from "
1598                           "system with non-RFC 2625 NAA value (%04x).\n",
1599                           source_naa));
1600
1601                 write_lock_irq(&bad_naa_lock);
1602                 for (prevnh = nh = mpt_bad_naa; nh != NULL;
1603                      prevnh=nh, nh=nh->next) {
1604                         if ((nh->ieee[0] == fch->saddr[0]) &&
1605                             (nh->ieee[1] == fch->saddr[1]) &&
1606                             (nh->ieee[2] == fch->saddr[2]) &&
1607                             (nh->ieee[3] == fch->saddr[3]) &&
1608                             (nh->ieee[4] == fch->saddr[4]) &&
1609                             (nh->ieee[5] == fch->saddr[5])) {
1610                                 found = 1;
1611                                 dlprintk ((KERN_INFO "mptlan/type_trans: ARP Re"
1612                                          "q/Rep w/ bad NAA from system already"
1613                                          " in DB.\n"));
1614                                 break;
1615                         }
1616                 }
1617
1618                 if ((!found) && (nh == NULL)) {
1619
1620                         nh = kmalloc(sizeof(struct NAA_Hosed), GFP_KERNEL);
1621                         dlprintk ((KERN_INFO "mptlan/type_trans: ARP Req/Rep w/"
1622                                  " bad NAA from system not yet in DB.\n"));
1623
1624                         if (nh != NULL) {
1625                                 nh->next = NULL;
1626                                 if (!mpt_bad_naa)
1627                                         mpt_bad_naa = nh;
1628                                 if (prevnh)
1629                                         prevnh->next = nh;
1630
1631                                 nh->NAA = source_naa; /* Set the S_NAA value. */
1632                                 for (i = 0; i < FC_ALEN; i++)
1633                                         nh->ieee[i] = fch->saddr[i];
1634                                 dlprintk ((KERN_INFO "Got ARP from %02x:%02x:%02x:%02x:"
1635                                           "%02x:%02x with non-compliant S_NAA value.\n",
1636                                           fch->saddr[0], fch->saddr[1], fch->saddr[2],
1637                                           fch->saddr[3], fch->saddr[4],fch->saddr[5]));
1638                         } else {
1639                                 printk (KERN_ERR "mptlan/type_trans: Unable to"
1640                                         " kmalloc a NAA_Hosed struct.\n");
1641                         }
1642                 } else if (!found) {
1643                         printk (KERN_ERR "mptlan/type_trans: found not"
1644                                 " set, but nh isn't null. Evil "
1645                                 "funkiness abounds.\n");
1646                 }
1647                 write_unlock_irq(&bad_naa_lock);
1648         }
1649 }
1650 #endif
1651
1652         /* Strip the SNAP header from ARP packets since we don't
1653          * pass them through to the 802.2/SNAP layers.
1654          */
1655         if (fcllc->dsap == EXTENDED_SAP &&
1656                 (fcllc->ethertype == htons(ETH_P_IP) ||
1657                  fcllc->ethertype == htons(ETH_P_ARP))) {
1658                 skb_pull(skb, sizeof(struct fcllc));
1659                 return fcllc->ethertype;
1660         }
1661
1662         return htons(ETH_P_802_2);
1663 }
1664
1665 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/