xref: /linux/drivers/message/fusion/mptlan.c (revision de2fe5e07d58424bc286fff3fd3c1b0bf933cd58)
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;
316 
317 	if (dev == NULL)
318 		return(1);
319 	else
320 		priv = netdev_priv(dev);
321 
322 	dlprintk((KERN_INFO MYNAM ": IOC %s_reset routed to LAN driver!\n",
323 			reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
324 			reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
325 
326 	if (priv->mpt_rxfidx == NULL)
327 		return (1);
328 
329 	if (reset_phase == MPT_IOC_SETUP_RESET) {
330 		;
331 	} else if (reset_phase == MPT_IOC_PRE_RESET) {
332 		int i;
333 		unsigned long flags;
334 
335 		netif_stop_queue(dev);
336 
337 		dlprintk ((KERN_INFO "mptlan/ioc_reset: called netif_stop_queue for %s.\n", dev->name));
338 
339 		atomic_set(&priv->buckets_out, 0);
340 
341 		/* Reset Rx Free Tail index and re-populate the queue. */
342 		spin_lock_irqsave(&priv->rxfidx_lock, flags);
343 		priv->mpt_rxfidx_tail = -1;
344 		for (i = 0; i < priv->max_buckets_out; i++)
345 			priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = i;
346 		spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
347 	} else {
348 		mpt_lan_post_receive_buckets(dev);
349 		netif_wake_queue(dev);
350 	}
351 
352 	return 1;
353 }
354 
355 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
356 static int
357 mpt_lan_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
358 {
359 	dlprintk((KERN_INFO MYNAM ": MPT event routed to LAN driver!\n"));
360 
361 	switch (le32_to_cpu(pEvReply->Event)) {
362 	case MPI_EVENT_NONE:				/* 00 */
363 	case MPI_EVENT_LOG_DATA:			/* 01 */
364 	case MPI_EVENT_STATE_CHANGE:			/* 02 */
365 	case MPI_EVENT_UNIT_ATTENTION:			/* 03 */
366 	case MPI_EVENT_IOC_BUS_RESET:			/* 04 */
367 	case MPI_EVENT_EXT_BUS_RESET:			/* 05 */
368 	case MPI_EVENT_RESCAN:				/* 06 */
369 		/* Ok, do we need to do anything here? As far as
370 		   I can tell, this is when a new device gets added
371 		   to the loop. */
372 	case MPI_EVENT_LINK_STATUS_CHANGE:		/* 07 */
373 	case MPI_EVENT_LOOP_STATE_CHANGE:		/* 08 */
374 	case MPI_EVENT_LOGOUT:				/* 09 */
375 	case MPI_EVENT_EVENT_CHANGE:			/* 0A */
376 	default:
377 		break;
378 	}
379 
380 	/*
381 	 *  NOTE: pEvent->AckRequired handling now done in mptbase.c;
382 	 *  Do NOT do it here now!
383 	 */
384 
385 	return 1;
386 }
387 
388 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
389 static int
390 mpt_lan_open(struct net_device *dev)
391 {
392 	struct mpt_lan_priv *priv = netdev_priv(dev);
393 	int i;
394 
395 	if (mpt_lan_reset(dev) != 0) {
396 		MPT_ADAPTER *mpt_dev = priv->mpt_dev;
397 
398 		printk (KERN_WARNING MYNAM "/lan_open: lan_reset failed.");
399 
400 		if (mpt_dev->active)
401 			printk ("The ioc is active. Perhaps it needs to be"
402 				" reset?\n");
403 		else
404 			printk ("The ioc in inactive, most likely in the "
405 				"process of being reset. Please try again in "
406 				"a moment.\n");
407 	}
408 
409 	priv->mpt_txfidx = kmalloc(priv->tx_max_out * sizeof(int), GFP_KERNEL);
410 	if (priv->mpt_txfidx == NULL)
411 		goto out;
412 	priv->mpt_txfidx_tail = -1;
413 
414 	priv->SendCtl = kcalloc(priv->tx_max_out, sizeof(struct BufferControl),
415 				GFP_KERNEL);
416 	if (priv->SendCtl == NULL)
417 		goto out_mpt_txfidx;
418 	for (i = 0; i < priv->tx_max_out; i++)
419 		priv->mpt_txfidx[++priv->mpt_txfidx_tail] = i;
420 
421 	dlprintk((KERN_INFO MYNAM "@lo: Finished initializing SendCtl\n"));
422 
423 	priv->mpt_rxfidx = kmalloc(priv->max_buckets_out * sizeof(int),
424 				   GFP_KERNEL);
425 	if (priv->mpt_rxfidx == NULL)
426 		goto out_SendCtl;
427 	priv->mpt_rxfidx_tail = -1;
428 
429 	priv->RcvCtl = kcalloc(priv->max_buckets_out,
430 			       sizeof(struct BufferControl),
431 			       GFP_KERNEL);
432 	if (priv->RcvCtl == NULL)
433 		goto out_mpt_rxfidx;
434 	for (i = 0; i < priv->max_buckets_out; i++)
435 		priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = i;
436 
437 /**/	dlprintk((KERN_INFO MYNAM "/lo: txfidx contains - "));
438 /**/	for (i = 0; i < priv->tx_max_out; i++)
439 /**/		dlprintk((" %xh", priv->mpt_txfidx[i]));
440 /**/	dlprintk(("\n"));
441 
442 	dlprintk((KERN_INFO MYNAM "/lo: Finished initializing RcvCtl\n"));
443 
444 	mpt_lan_post_receive_buckets(dev);
445 	printk(KERN_INFO MYNAM ": %s/%s: interface up & active\n",
446 			IOC_AND_NETDEV_NAMES_s_s(dev));
447 
448 	if (mpt_event_register(LanCtx, mpt_lan_event_process) != 0) {
449 		printk (KERN_WARNING MYNAM "/lo: Unable to register for Event"
450 			" Notifications. This is a bad thing! We're not going "
451 			"to go ahead, but I'd be leery of system stability at "
452 			"this point.\n");
453 	}
454 
455 	netif_start_queue(dev);
456 	dlprintk((KERN_INFO MYNAM "/lo: Done.\n"));
457 
458 	return 0;
459 out_mpt_rxfidx:
460 	kfree(priv->mpt_rxfidx);
461 	priv->mpt_rxfidx = NULL;
462 out_SendCtl:
463 	kfree(priv->SendCtl);
464 	priv->SendCtl = NULL;
465 out_mpt_txfidx:
466 	kfree(priv->mpt_txfidx);
467 	priv->mpt_txfidx = NULL;
468 out:	return -ENOMEM;
469 }
470 
471 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
472 /* Send a LanReset message to the FW. This should result in the FW returning
473    any buckets it still has. */
474 static int
475 mpt_lan_reset(struct net_device *dev)
476 {
477 	MPT_FRAME_HDR *mf;
478 	LANResetRequest_t *pResetReq;
479 	struct mpt_lan_priv *priv = netdev_priv(dev);
480 
481 	mf = mpt_get_msg_frame(LanCtx, priv->mpt_dev);
482 
483 	if (mf == NULL) {
484 /*		dlprintk((KERN_ERR MYNAM "/reset: Evil funkiness abounds! "
485 		"Unable to allocate a request frame.\n"));
486 */
487 		return -1;
488 	}
489 
490 	pResetReq = (LANResetRequest_t *) mf;
491 
492 	pResetReq->Function	= MPI_FUNCTION_LAN_RESET;
493 	pResetReq->ChainOffset	= 0;
494 	pResetReq->Reserved	= 0;
495 	pResetReq->PortNumber	= priv->pnum;
496 	pResetReq->MsgFlags	= 0;
497 	pResetReq->Reserved2	= 0;
498 
499 	mpt_put_msg_frame(LanCtx, priv->mpt_dev, mf);
500 
501 	return 0;
502 }
503 
504 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
505 static int
506 mpt_lan_close(struct net_device *dev)
507 {
508 	struct mpt_lan_priv *priv = netdev_priv(dev);
509 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
510 	unsigned long timeout;
511 	int i;
512 
513 	dlprintk((KERN_INFO MYNAM ": mpt_lan_close called\n"));
514 
515 	mpt_event_deregister(LanCtx);
516 
517 	dlprintk((KERN_INFO MYNAM ":lan_close: Posted %d buckets "
518 		  "since driver was loaded, %d still out\n",
519 		  priv->total_posted,atomic_read(&priv->buckets_out)));
520 
521 	netif_stop_queue(dev);
522 
523 	mpt_lan_reset(dev);
524 
525 	timeout = jiffies + 2 * HZ;
526 	while (atomic_read(&priv->buckets_out) && time_before(jiffies, timeout))
527 		schedule_timeout_interruptible(1);
528 
529 	for (i = 0; i < priv->max_buckets_out; i++) {
530 		if (priv->RcvCtl[i].skb != NULL) {
531 /**/			dlprintk((KERN_INFO MYNAM "/lan_close: bucket %05x "
532 /**/				  "is still out\n", i));
533 			pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[i].dma,
534 					 priv->RcvCtl[i].len,
535 					 PCI_DMA_FROMDEVICE);
536 			dev_kfree_skb(priv->RcvCtl[i].skb);
537 		}
538 	}
539 
540 	kfree(priv->RcvCtl);
541 	kfree(priv->mpt_rxfidx);
542 
543 	for (i = 0; i < priv->tx_max_out; i++) {
544 		if (priv->SendCtl[i].skb != NULL) {
545 			pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[i].dma,
546 					 priv->SendCtl[i].len,
547 					 PCI_DMA_TODEVICE);
548 			dev_kfree_skb(priv->SendCtl[i].skb);
549 		}
550 	}
551 
552 	kfree(priv->SendCtl);
553 	kfree(priv->mpt_txfidx);
554 
555 	atomic_set(&priv->buckets_out, 0);
556 
557 	printk(KERN_INFO MYNAM ": %s/%s: interface down & inactive\n",
558 			IOC_AND_NETDEV_NAMES_s_s(dev));
559 
560 	return 0;
561 }
562 
563 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
564 static struct net_device_stats *
565 mpt_lan_get_stats(struct net_device *dev)
566 {
567 	struct mpt_lan_priv *priv = netdev_priv(dev);
568 
569 	return (struct net_device_stats *) &priv->stats;
570 }
571 
572 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
573 static int
574 mpt_lan_change_mtu(struct net_device *dev, int new_mtu)
575 {
576 	if ((new_mtu < MPT_LAN_MIN_MTU) || (new_mtu > MPT_LAN_MAX_MTU))
577 		return -EINVAL;
578 	dev->mtu = new_mtu;
579 	return 0;
580 }
581 
582 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
583 /* Tx timeout handler. */
584 static void
585 mpt_lan_tx_timeout(struct net_device *dev)
586 {
587 	struct mpt_lan_priv *priv = netdev_priv(dev);
588 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
589 
590 	if (mpt_dev->active) {
591 		dlprintk (("mptlan/tx_timeout: calling netif_wake_queue for %s.\n", dev->name));
592 		netif_wake_queue(dev);
593 	}
594 }
595 
596 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
597 //static inline int
598 static int
599 mpt_lan_send_turbo(struct net_device *dev, u32 tmsg)
600 {
601 	struct mpt_lan_priv *priv = netdev_priv(dev);
602 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
603 	struct sk_buff *sent;
604 	unsigned long flags;
605 	u32 ctx;
606 
607 	ctx = GET_LAN_BUFFER_CONTEXT(tmsg);
608 	sent = priv->SendCtl[ctx].skb;
609 
610 	priv->stats.tx_packets++;
611 	priv->stats.tx_bytes += sent->len;
612 
613 	dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n",
614 			IOC_AND_NETDEV_NAMES_s_s(dev),
615 			__FUNCTION__, sent));
616 
617 	priv->SendCtl[ctx].skb = NULL;
618 	pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[ctx].dma,
619 			 priv->SendCtl[ctx].len, PCI_DMA_TODEVICE);
620 	dev_kfree_skb_irq(sent);
621 
622 	spin_lock_irqsave(&priv->txfidx_lock, flags);
623 	priv->mpt_txfidx[++priv->mpt_txfidx_tail] = ctx;
624 	spin_unlock_irqrestore(&priv->txfidx_lock, flags);
625 
626 	netif_wake_queue(dev);
627 	return 0;
628 }
629 
630 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
631 static int
632 mpt_lan_send_reply(struct net_device *dev, LANSendReply_t *pSendRep)
633 {
634 	struct mpt_lan_priv *priv = netdev_priv(dev);
635 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
636 	struct sk_buff *sent;
637 	unsigned long flags;
638 	int FreeReqFrame = 0;
639 	u32 *pContext;
640 	u32 ctx;
641 	u8 count;
642 
643 	count = pSendRep->NumberOfContexts;
644 
645 	dioprintk((KERN_INFO MYNAM ": send_reply: IOCStatus: %04x\n",
646 		 le16_to_cpu(pSendRep->IOCStatus)));
647 
648 	/* Add check for Loginfo Flag in IOCStatus */
649 
650 	switch (le16_to_cpu(pSendRep->IOCStatus) & MPI_IOCSTATUS_MASK) {
651 	case MPI_IOCSTATUS_SUCCESS:
652 		priv->stats.tx_packets += count;
653 		break;
654 
655 	case MPI_IOCSTATUS_LAN_CANCELED:
656 	case MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED:
657 		break;
658 
659 	case MPI_IOCSTATUS_INVALID_SGL:
660 		priv->stats.tx_errors += count;
661 		printk (KERN_ERR MYNAM ": %s/%s: ERROR - Invalid SGL sent to IOC!\n",
662 				IOC_AND_NETDEV_NAMES_s_s(dev));
663 		goto out;
664 
665 	default:
666 		priv->stats.tx_errors += count;
667 		break;
668 	}
669 
670 	pContext = &pSendRep->BufferContext;
671 
672 	spin_lock_irqsave(&priv->txfidx_lock, flags);
673 	while (count > 0) {
674 		ctx = GET_LAN_BUFFER_CONTEXT(le32_to_cpu(*pContext));
675 
676 		sent = priv->SendCtl[ctx].skb;
677 		priv->stats.tx_bytes += sent->len;
678 
679 		dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n",
680 				IOC_AND_NETDEV_NAMES_s_s(dev),
681 				__FUNCTION__, sent));
682 
683 		priv->SendCtl[ctx].skb = NULL;
684 		pci_unmap_single(mpt_dev->pcidev, priv->SendCtl[ctx].dma,
685 				 priv->SendCtl[ctx].len, PCI_DMA_TODEVICE);
686 		dev_kfree_skb_irq(sent);
687 
688 		priv->mpt_txfidx[++priv->mpt_txfidx_tail] = ctx;
689 
690 		pContext++;
691 		count--;
692 	}
693 	spin_unlock_irqrestore(&priv->txfidx_lock, flags);
694 
695 out:
696 	if (!(pSendRep->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY))
697 		FreeReqFrame = 1;
698 
699 	netif_wake_queue(dev);
700 	return FreeReqFrame;
701 }
702 
703 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
704 static int
705 mpt_lan_sdu_send (struct sk_buff *skb, struct net_device *dev)
706 {
707 	struct mpt_lan_priv *priv = netdev_priv(dev);
708 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
709 	MPT_FRAME_HDR *mf;
710 	LANSendRequest_t *pSendReq;
711 	SGETransaction32_t *pTrans;
712 	SGESimple64_t *pSimple;
713 	dma_addr_t dma;
714 	unsigned long flags;
715 	int ctx;
716 	u16 cur_naa = 0x1000;
717 
718 	dioprintk((KERN_INFO MYNAM ": %s called, skb_addr = %p\n",
719 			__FUNCTION__, skb));
720 
721 	spin_lock_irqsave(&priv->txfidx_lock, flags);
722 	if (priv->mpt_txfidx_tail < 0) {
723 		netif_stop_queue(dev);
724 		spin_unlock_irqrestore(&priv->txfidx_lock, flags);
725 
726 		printk (KERN_ERR "%s: no tx context available: %u\n",
727 			__FUNCTION__, priv->mpt_txfidx_tail);
728 		return 1;
729 	}
730 
731 	mf = mpt_get_msg_frame(LanCtx, mpt_dev);
732 	if (mf == NULL) {
733 		netif_stop_queue(dev);
734 		spin_unlock_irqrestore(&priv->txfidx_lock, flags);
735 
736 		printk (KERN_ERR "%s: Unable to alloc request frame\n",
737 			__FUNCTION__);
738 		return 1;
739 	}
740 
741 	ctx = priv->mpt_txfidx[priv->mpt_txfidx_tail--];
742 	spin_unlock_irqrestore(&priv->txfidx_lock, flags);
743 
744 //	dioprintk((KERN_INFO MYNAM ": %s/%s: Creating new msg frame (send).\n",
745 //			IOC_AND_NETDEV_NAMES_s_s(dev)));
746 
747 	pSendReq = (LANSendRequest_t *) mf;
748 
749 	/* Set the mac.raw pointer, since this apparently isn't getting
750 	 * done before we get the skb. Pull the data pointer past the mac data.
751 	 */
752 	skb->mac.raw = skb->data;
753 	skb_pull(skb, 12);
754 
755         dma = pci_map_single(mpt_dev->pcidev, skb->data, skb->len,
756 			     PCI_DMA_TODEVICE);
757 
758 	priv->SendCtl[ctx].skb = skb;
759 	priv->SendCtl[ctx].dma = dma;
760 	priv->SendCtl[ctx].len = skb->len;
761 
762 	/* Message Header */
763 	pSendReq->Reserved    = 0;
764 	pSendReq->Function    = MPI_FUNCTION_LAN_SEND;
765 	pSendReq->ChainOffset = 0;
766 	pSendReq->Reserved2   = 0;
767 	pSendReq->MsgFlags    = 0;
768 	pSendReq->PortNumber  = priv->pnum;
769 
770 	/* Transaction Context Element */
771 	pTrans = (SGETransaction32_t *) pSendReq->SG_List;
772 
773 	/* No Flags, 8 bytes of Details, 32bit Context (bloody turbo replies) */
774 	pTrans->ContextSize   = sizeof(u32);
775 	pTrans->DetailsLength = 2 * sizeof(u32);
776 	pTrans->Flags         = 0;
777 	pTrans->TransactionContext[0] = cpu_to_le32(ctx);
778 
779 //	dioprintk((KERN_INFO MYNAM ": %s/%s: BC = %08x, skb = %p, buff = %p\n",
780 //			IOC_AND_NETDEV_NAMES_s_s(dev),
781 //			ctx, skb, skb->data));
782 
783 #ifdef QLOGIC_NAA_WORKAROUND
784 {
785 	struct NAA_Hosed *nh;
786 
787 	/* Munge the NAA for Tx packets to QLogic boards, which don't follow
788 	   RFC 2625. The longer I look at this, the more my opinion of Qlogic
789 	   drops. */
790 	read_lock_irq(&bad_naa_lock);
791 	for (nh = mpt_bad_naa; nh != NULL; nh=nh->next) {
792 		if ((nh->ieee[0] == skb->mac.raw[0]) &&
793 		    (nh->ieee[1] == skb->mac.raw[1]) &&
794 		    (nh->ieee[2] == skb->mac.raw[2]) &&
795 		    (nh->ieee[3] == skb->mac.raw[3]) &&
796 		    (nh->ieee[4] == skb->mac.raw[4]) &&
797 		    (nh->ieee[5] == skb->mac.raw[5])) {
798 			cur_naa = nh->NAA;
799 			dlprintk ((KERN_INFO "mptlan/sdu_send: using NAA value "
800 				  "= %04x.\n", cur_naa));
801 			break;
802 		}
803 	}
804 	read_unlock_irq(&bad_naa_lock);
805 }
806 #endif
807 
808 	pTrans->TransactionDetails[0] = cpu_to_le32((cur_naa         << 16) |
809 						    (skb->mac.raw[0] <<  8) |
810 						    (skb->mac.raw[1] <<  0));
811 	pTrans->TransactionDetails[1] = cpu_to_le32((skb->mac.raw[2] << 24) |
812 						    (skb->mac.raw[3] << 16) |
813 						    (skb->mac.raw[4] <<  8) |
814 						    (skb->mac.raw[5] <<  0));
815 
816 	pSimple = (SGESimple64_t *) &pTrans->TransactionDetails[2];
817 
818 	/* If we ever decide to send more than one Simple SGE per LANSend, then
819 	   we will need to make sure that LAST_ELEMENT only gets set on the
820 	   last one. Otherwise, bad voodoo and evil funkiness will commence. */
821 	pSimple->FlagsLength = cpu_to_le32(
822 			((MPI_SGE_FLAGS_LAST_ELEMENT |
823 			  MPI_SGE_FLAGS_END_OF_BUFFER |
824 			  MPI_SGE_FLAGS_SIMPLE_ELEMENT |
825 			  MPI_SGE_FLAGS_SYSTEM_ADDRESS |
826 			  MPI_SGE_FLAGS_HOST_TO_IOC |
827 			  MPI_SGE_FLAGS_64_BIT_ADDRESSING |
828 			  MPI_SGE_FLAGS_END_OF_LIST) << MPI_SGE_FLAGS_SHIFT) |
829 			skb->len);
830 	pSimple->Address.Low = cpu_to_le32((u32) dma);
831 	if (sizeof(dma_addr_t) > sizeof(u32))
832 		pSimple->Address.High = cpu_to_le32((u32) ((u64) dma >> 32));
833 	else
834 		pSimple->Address.High = 0;
835 
836 	mpt_put_msg_frame (LanCtx, mpt_dev, mf);
837 	dev->trans_start = jiffies;
838 
839 	dioprintk((KERN_INFO MYNAM ": %s/%s: Sending packet. FlagsLength = %08x.\n",
840 			IOC_AND_NETDEV_NAMES_s_s(dev),
841 			le32_to_cpu(pSimple->FlagsLength)));
842 
843 	return 0;
844 }
845 
846 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
847 static void
848 mpt_lan_wake_post_buckets_task(struct net_device *dev, int priority)
849 /*
850  * @priority: 0 = put it on the timer queue, 1 = put it on the immediate queue
851  */
852 {
853 	struct mpt_lan_priv *priv = dev->priv;
854 
855 	if (test_and_set_bit(0, &priv->post_buckets_active) == 0) {
856 		if (priority) {
857 			schedule_work(&priv->post_buckets_task);
858 		} else {
859 			schedule_delayed_work(&priv->post_buckets_task, 1);
860 			dioprintk((KERN_INFO MYNAM ": post_buckets queued on "
861 				   "timer.\n"));
862 		}
863 	        dioprintk((KERN_INFO MYNAM ": %s/%s: Queued post_buckets task.\n",
864 			   IOC_AND_NETDEV_NAMES_s_s(dev) ));
865 	}
866 }
867 
868 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
869 static int
870 mpt_lan_receive_skb(struct net_device *dev, struct sk_buff *skb)
871 {
872 	struct mpt_lan_priv *priv = dev->priv;
873 
874 	skb->protocol = mpt_lan_type_trans(skb, dev);
875 
876 	dioprintk((KERN_INFO MYNAM ": %s/%s: Incoming packet (%d bytes) "
877 		 "delivered to upper level.\n",
878 			IOC_AND_NETDEV_NAMES_s_s(dev), skb->len));
879 
880 	priv->stats.rx_bytes += skb->len;
881 	priv->stats.rx_packets++;
882 
883 	skb->dev = dev;
884 	netif_rx(skb);
885 
886 	dioprintk((MYNAM "/receive_skb: %d buckets remaining\n",
887 		 atomic_read(&priv->buckets_out)));
888 
889 	if (atomic_read(&priv->buckets_out) < priv->bucketthresh)
890 		mpt_lan_wake_post_buckets_task(dev, 1);
891 
892 	dioprintk((KERN_INFO MYNAM "/receive_post_reply: %d buckets "
893 		  "remaining, %d received back since sod\n",
894 		  atomic_read(&priv->buckets_out), priv->total_received));
895 
896 	return 0;
897 }
898 
899 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
900 //static inline int
901 static int
902 mpt_lan_receive_post_turbo(struct net_device *dev, u32 tmsg)
903 {
904 	struct mpt_lan_priv *priv = dev->priv;
905 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
906 	struct sk_buff *skb, *old_skb;
907 	unsigned long flags;
908 	u32 ctx, len;
909 
910 	ctx = GET_LAN_BUCKET_CONTEXT(tmsg);
911 	skb = priv->RcvCtl[ctx].skb;
912 
913 	len = GET_LAN_PACKET_LENGTH(tmsg);
914 
915 	if (len < MPT_LAN_RX_COPYBREAK) {
916 		old_skb = skb;
917 
918 		skb = (struct sk_buff *)dev_alloc_skb(len);
919 		if (!skb) {
920 			printk (KERN_ERR MYNAM ": %s/%s: ERROR - Can't allocate skb! (%s@%d)\n",
921 					IOC_AND_NETDEV_NAMES_s_s(dev),
922 					__FILE__, __LINE__);
923 			return -ENOMEM;
924 		}
925 
926 		pci_dma_sync_single_for_cpu(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
927 					    priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
928 
929 		memcpy(skb_put(skb, len), old_skb->data, len);
930 
931 		pci_dma_sync_single_for_device(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
932 					       priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
933 		goto out;
934 	}
935 
936 	skb_put(skb, len);
937 
938 	priv->RcvCtl[ctx].skb = NULL;
939 
940 	pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
941 			 priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
942 
943 out:
944 	spin_lock_irqsave(&priv->rxfidx_lock, flags);
945 	priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
946 	spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
947 
948 	atomic_dec(&priv->buckets_out);
949 	priv->total_received++;
950 
951 	return mpt_lan_receive_skb(dev, skb);
952 }
953 
954 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
955 static int
956 mpt_lan_receive_post_free(struct net_device *dev,
957 			  LANReceivePostReply_t *pRecvRep)
958 {
959 	struct mpt_lan_priv *priv = dev->priv;
960 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
961 	unsigned long flags;
962 	struct sk_buff *skb;
963 	u32 ctx;
964 	int count;
965 	int i;
966 
967 	count = pRecvRep->NumberOfContexts;
968 
969 /**/	dlprintk((KERN_INFO MYNAM "/receive_post_reply: "
970 		  "IOC returned %d buckets, freeing them...\n", count));
971 
972 	spin_lock_irqsave(&priv->rxfidx_lock, flags);
973 	for (i = 0; i < count; i++) {
974 		ctx = le32_to_cpu(pRecvRep->BucketContext[i]);
975 
976 		skb = priv->RcvCtl[ctx].skb;
977 
978 //		dlprintk((KERN_INFO MYNAM ": %s: dev_name = %s\n",
979 //				IOC_AND_NETDEV_NAMES_s_s(dev)));
980 //		dlprintk((KERN_INFO MYNAM "@rpr[2], priv = %p, buckets_out addr = %p",
981 //				priv, &(priv->buckets_out)));
982 //		dlprintk((KERN_INFO MYNAM "@rpr[2] TC + 3\n"));
983 
984 		priv->RcvCtl[ctx].skb = NULL;
985 		pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
986 				 priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
987 		dev_kfree_skb_any(skb);
988 
989 		priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
990 	}
991 	spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
992 
993 	atomic_sub(count, &priv->buckets_out);
994 
995 //	for (i = 0; i < priv->max_buckets_out; i++)
996 //		if (priv->RcvCtl[i].skb != NULL)
997 //			dlprintk((KERN_INFO MYNAM "@rpr: bucket %03x "
998 //				  "is still out\n", i));
999 
1000 /*	dlprintk((KERN_INFO MYNAM "/receive_post_reply: freed %d buckets\n",
1001 		  count));
1002 */
1003 /**/	dlprintk((KERN_INFO MYNAM "@receive_post_reply: %d buckets "
1004 /**/		  "remaining, %d received back since sod.\n",
1005 /**/		  atomic_read(&priv->buckets_out), priv->total_received));
1006 	return 0;
1007 }
1008 
1009 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1010 static int
1011 mpt_lan_receive_post_reply(struct net_device *dev,
1012 			   LANReceivePostReply_t *pRecvRep)
1013 {
1014 	struct mpt_lan_priv *priv = dev->priv;
1015 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
1016 	struct sk_buff *skb, *old_skb;
1017 	unsigned long flags;
1018 	u32 len, ctx, offset;
1019 	u32 remaining = le32_to_cpu(pRecvRep->BucketsRemaining);
1020 	int count;
1021 	int i, l;
1022 
1023 	dioprintk((KERN_INFO MYNAM ": mpt_lan_receive_post_reply called\n"));
1024 	dioprintk((KERN_INFO MYNAM ": receive_post_reply: IOCStatus: %04x\n",
1025 		 le16_to_cpu(pRecvRep->IOCStatus)));
1026 
1027 	if ((le16_to_cpu(pRecvRep->IOCStatus) & MPI_IOCSTATUS_MASK) ==
1028 						MPI_IOCSTATUS_LAN_CANCELED)
1029 		return mpt_lan_receive_post_free(dev, pRecvRep);
1030 
1031 	len = le32_to_cpu(pRecvRep->PacketLength);
1032 	if (len == 0) {
1033 		printk (KERN_ERR MYNAM ": %s/%s: ERROR - Got a non-TURBO "
1034 			"ReceivePostReply w/ PacketLength zero!\n",
1035 				IOC_AND_NETDEV_NAMES_s_s(dev));
1036 		printk (KERN_ERR MYNAM ": MsgFlags = %02x, IOCStatus = %04x\n",
1037 				pRecvRep->MsgFlags, le16_to_cpu(pRecvRep->IOCStatus));
1038 		return -1;
1039 	}
1040 
1041 	ctx    = le32_to_cpu(pRecvRep->BucketContext[0]);
1042 	count  = pRecvRep->NumberOfContexts;
1043 	skb    = priv->RcvCtl[ctx].skb;
1044 
1045 	offset = le32_to_cpu(pRecvRep->PacketOffset);
1046 //	if (offset != 0) {
1047 //		printk (KERN_INFO MYNAM ": %s/%s: Got a ReceivePostReply "
1048 //			"w/ PacketOffset %u\n",
1049 //				IOC_AND_NETDEV_NAMES_s_s(dev),
1050 //				offset);
1051 //	}
1052 
1053 	dioprintk((KERN_INFO MYNAM ": %s/%s: @rpr, offset = %d, len = %d\n",
1054 			IOC_AND_NETDEV_NAMES_s_s(dev),
1055 			offset, len));
1056 
1057 	if (count > 1) {
1058 		int szrem = len;
1059 
1060 //		dioprintk((KERN_INFO MYNAM ": %s/%s: Multiple buckets returned "
1061 //			"for single packet, concatenating...\n",
1062 //				IOC_AND_NETDEV_NAMES_s_s(dev)));
1063 
1064 		skb = (struct sk_buff *)dev_alloc_skb(len);
1065 		if (!skb) {
1066 			printk (KERN_ERR MYNAM ": %s/%s: ERROR - Can't allocate skb! (%s@%d)\n",
1067 					IOC_AND_NETDEV_NAMES_s_s(dev),
1068 					__FILE__, __LINE__);
1069 			return -ENOMEM;
1070 		}
1071 
1072 		spin_lock_irqsave(&priv->rxfidx_lock, flags);
1073 		for (i = 0; i < count; i++) {
1074 
1075 			ctx = le32_to_cpu(pRecvRep->BucketContext[i]);
1076 			old_skb = priv->RcvCtl[ctx].skb;
1077 
1078 			l = priv->RcvCtl[ctx].len;
1079 			if (szrem < l)
1080 				l = szrem;
1081 
1082 //			dioprintk((KERN_INFO MYNAM ": %s/%s: Buckets = %d, len = %u\n",
1083 //					IOC_AND_NETDEV_NAMES_s_s(dev),
1084 //					i, l));
1085 
1086 			pci_dma_sync_single_for_cpu(mpt_dev->pcidev,
1087 						    priv->RcvCtl[ctx].dma,
1088 						    priv->RcvCtl[ctx].len,
1089 						    PCI_DMA_FROMDEVICE);
1090 			memcpy(skb_put(skb, l), old_skb->data, l);
1091 
1092 			pci_dma_sync_single_for_device(mpt_dev->pcidev,
1093 						       priv->RcvCtl[ctx].dma,
1094 						       priv->RcvCtl[ctx].len,
1095 						       PCI_DMA_FROMDEVICE);
1096 
1097 			priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1098 			szrem -= l;
1099 		}
1100 		spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1101 
1102 	} else if (len < MPT_LAN_RX_COPYBREAK) {
1103 
1104 		old_skb = skb;
1105 
1106 		skb = (struct sk_buff *)dev_alloc_skb(len);
1107 		if (!skb) {
1108 			printk (KERN_ERR MYNAM ": %s/%s: ERROR - Can't allocate skb! (%s@%d)\n",
1109 					IOC_AND_NETDEV_NAMES_s_s(dev),
1110 					__FILE__, __LINE__);
1111 			return -ENOMEM;
1112 		}
1113 
1114 		pci_dma_sync_single_for_cpu(mpt_dev->pcidev,
1115 					    priv->RcvCtl[ctx].dma,
1116 					    priv->RcvCtl[ctx].len,
1117 					    PCI_DMA_FROMDEVICE);
1118 
1119 		memcpy(skb_put(skb, len), old_skb->data, len);
1120 
1121 		pci_dma_sync_single_for_device(mpt_dev->pcidev,
1122 					       priv->RcvCtl[ctx].dma,
1123 					       priv->RcvCtl[ctx].len,
1124 					       PCI_DMA_FROMDEVICE);
1125 
1126 		spin_lock_irqsave(&priv->rxfidx_lock, flags);
1127 		priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1128 		spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1129 
1130 	} else {
1131 		spin_lock_irqsave(&priv->rxfidx_lock, flags);
1132 
1133 		priv->RcvCtl[ctx].skb = NULL;
1134 
1135 		pci_unmap_single(mpt_dev->pcidev, priv->RcvCtl[ctx].dma,
1136 				 priv->RcvCtl[ctx].len, PCI_DMA_FROMDEVICE);
1137 		priv->RcvCtl[ctx].dma = 0;
1138 
1139 		priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1140 		spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1141 
1142 		skb_put(skb,len);
1143 	}
1144 
1145 	atomic_sub(count, &priv->buckets_out);
1146 	priv->total_received += count;
1147 
1148 	if (priv->mpt_rxfidx_tail >= MPT_LAN_MAX_BUCKETS_OUT) {
1149 		printk (KERN_ERR MYNAM ": %s/%s: Yoohoo! mpt_rxfidx_tail = %d, "
1150 			"MPT_LAN_MAX_BUCKETS_OUT = %d\n",
1151 				IOC_AND_NETDEV_NAMES_s_s(dev),
1152 				priv->mpt_rxfidx_tail,
1153 				MPT_LAN_MAX_BUCKETS_OUT);
1154 
1155 		return -1;
1156 	}
1157 
1158 	if (remaining == 0)
1159 		printk (KERN_WARNING MYNAM ": %s/%s: WARNING - IOC out of buckets! "
1160 			"(priv->buckets_out = %d)\n",
1161 			IOC_AND_NETDEV_NAMES_s_s(dev),
1162 			atomic_read(&priv->buckets_out));
1163 	else if (remaining < 10)
1164 		printk (KERN_INFO MYNAM ": %s/%s: IOC says %d buckets left. "
1165 			"(priv->buckets_out = %d)\n",
1166 			IOC_AND_NETDEV_NAMES_s_s(dev),
1167 			remaining, atomic_read(&priv->buckets_out));
1168 
1169 	if ((remaining < priv->bucketthresh) &&
1170 	    ((atomic_read(&priv->buckets_out) - remaining) >
1171 	     MPT_LAN_BUCKETS_REMAIN_MISMATCH_THRESH)) {
1172 
1173 		printk (KERN_WARNING MYNAM " Mismatch between driver's "
1174 			"buckets_out count and fw's BucketsRemaining "
1175 			"count has crossed the threshold, issuing a "
1176 			"LanReset to clear the fw's hashtable. You may "
1177 			"want to check your /var/log/messages for \"CRC "
1178 			"error\" event notifications.\n");
1179 
1180 		mpt_lan_reset(dev);
1181 		mpt_lan_wake_post_buckets_task(dev, 0);
1182 	}
1183 
1184 	return mpt_lan_receive_skb(dev, skb);
1185 }
1186 
1187 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1188 /* Simple SGE's only at the moment */
1189 
1190 static void
1191 mpt_lan_post_receive_buckets(void *dev_id)
1192 {
1193 	struct net_device *dev = dev_id;
1194 	struct mpt_lan_priv *priv = dev->priv;
1195 	MPT_ADAPTER *mpt_dev = priv->mpt_dev;
1196 	MPT_FRAME_HDR *mf;
1197 	LANReceivePostRequest_t *pRecvReq;
1198 	SGETransaction32_t *pTrans;
1199 	SGESimple64_t *pSimple;
1200 	struct sk_buff *skb;
1201 	dma_addr_t dma;
1202 	u32 curr, buckets, count, max;
1203 	u32 len = (dev->mtu + dev->hard_header_len + 4);
1204 	unsigned long flags;
1205 	int i;
1206 
1207 	curr = atomic_read(&priv->buckets_out);
1208 	buckets = (priv->max_buckets_out - curr);
1209 
1210 	dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, Start_buckets = %u, buckets_out = %u\n",
1211 			IOC_AND_NETDEV_NAMES_s_s(dev),
1212 			__FUNCTION__, buckets, curr));
1213 
1214 	max = (mpt_dev->req_sz - MPT_LAN_RECEIVE_POST_REQUEST_SIZE) /
1215 			(MPT_LAN_TRANSACTION32_SIZE + sizeof(SGESimple64_t));
1216 
1217 	while (buckets) {
1218 		mf = mpt_get_msg_frame(LanCtx, mpt_dev);
1219 		if (mf == NULL) {
1220 			printk (KERN_ERR "%s: Unable to alloc request frame\n",
1221 				__FUNCTION__);
1222 			dioprintk((KERN_ERR "%s: %u buckets remaining\n",
1223 				 __FUNCTION__, buckets));
1224 			goto out;
1225 		}
1226 		pRecvReq = (LANReceivePostRequest_t *) mf;
1227 
1228 		count = buckets;
1229 		if (count > max)
1230 			count = max;
1231 
1232 		pRecvReq->Function    = MPI_FUNCTION_LAN_RECEIVE;
1233 		pRecvReq->ChainOffset = 0;
1234 		pRecvReq->MsgFlags    = 0;
1235 		pRecvReq->PortNumber  = priv->pnum;
1236 
1237 		pTrans = (SGETransaction32_t *) pRecvReq->SG_List;
1238 		pSimple = NULL;
1239 
1240 		for (i = 0; i < count; i++) {
1241 			int ctx;
1242 
1243 			spin_lock_irqsave(&priv->rxfidx_lock, flags);
1244 			if (priv->mpt_rxfidx_tail < 0) {
1245 				printk (KERN_ERR "%s: Can't alloc context\n",
1246 					__FUNCTION__);
1247 				spin_unlock_irqrestore(&priv->rxfidx_lock,
1248 						       flags);
1249 				break;
1250 			}
1251 
1252 			ctx = priv->mpt_rxfidx[priv->mpt_rxfidx_tail--];
1253 
1254 			skb = priv->RcvCtl[ctx].skb;
1255 			if (skb && (priv->RcvCtl[ctx].len != len)) {
1256 				pci_unmap_single(mpt_dev->pcidev,
1257 						 priv->RcvCtl[ctx].dma,
1258 						 priv->RcvCtl[ctx].len,
1259 						 PCI_DMA_FROMDEVICE);
1260 				dev_kfree_skb(priv->RcvCtl[ctx].skb);
1261 				skb = priv->RcvCtl[ctx].skb = NULL;
1262 			}
1263 
1264 			if (skb == NULL) {
1265 				skb = dev_alloc_skb(len);
1266 				if (skb == NULL) {
1267 					printk (KERN_WARNING
1268 						MYNAM "/%s: Can't alloc skb\n",
1269 						__FUNCTION__);
1270 					priv->mpt_rxfidx[++priv->mpt_rxfidx_tail] = ctx;
1271 					spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1272 					break;
1273 				}
1274 
1275 				dma = pci_map_single(mpt_dev->pcidev, skb->data,
1276 						     len, PCI_DMA_FROMDEVICE);
1277 
1278 				priv->RcvCtl[ctx].skb = skb;
1279 				priv->RcvCtl[ctx].dma = dma;
1280 				priv->RcvCtl[ctx].len = len;
1281 			}
1282 
1283 			spin_unlock_irqrestore(&priv->rxfidx_lock, flags);
1284 
1285 			pTrans->ContextSize   = sizeof(u32);
1286 			pTrans->DetailsLength = 0;
1287 			pTrans->Flags         = 0;
1288 			pTrans->TransactionContext[0] = cpu_to_le32(ctx);
1289 
1290 			pSimple = (SGESimple64_t *) pTrans->TransactionDetails;
1291 
1292 			pSimple->FlagsLength = cpu_to_le32(
1293 				((MPI_SGE_FLAGS_END_OF_BUFFER |
1294 				  MPI_SGE_FLAGS_SIMPLE_ELEMENT |
1295 				  MPI_SGE_FLAGS_64_BIT_ADDRESSING) << MPI_SGE_FLAGS_SHIFT) | len);
1296 			pSimple->Address.Low = cpu_to_le32((u32) priv->RcvCtl[ctx].dma);
1297 			if (sizeof(dma_addr_t) > sizeof(u32))
1298 				pSimple->Address.High = cpu_to_le32((u32) ((u64) priv->RcvCtl[ctx].dma >> 32));
1299 			else
1300 				pSimple->Address.High = 0;
1301 
1302 			pTrans = (SGETransaction32_t *) (pSimple + 1);
1303 		}
1304 
1305 		if (pSimple == NULL) {
1306 /**/			printk (KERN_WARNING MYNAM "/%s: No buckets posted\n",
1307 /**/				__FUNCTION__);
1308 			mpt_free_msg_frame(mpt_dev, mf);
1309 			goto out;
1310 		}
1311 
1312 		pSimple->FlagsLength |= cpu_to_le32(MPI_SGE_FLAGS_END_OF_LIST << MPI_SGE_FLAGS_SHIFT);
1313 
1314 		pRecvReq->BucketCount = cpu_to_le32(i);
1315 
1316 /*	printk(KERN_INFO MYNAM ": posting buckets\n   ");
1317  *	for (i = 0; i < j + 2; i ++)
1318  *	    printk (" %08x", le32_to_cpu(msg[i]));
1319  *	printk ("\n");
1320  */
1321 
1322 		mpt_put_msg_frame(LanCtx, mpt_dev, mf);
1323 
1324 		priv->total_posted += i;
1325 		buckets -= i;
1326 		atomic_add(i, &priv->buckets_out);
1327 	}
1328 
1329 out:
1330 	dioprintk((KERN_INFO MYNAM "/%s: End_buckets = %u, priv->buckets_out = %u\n",
1331 		  __FUNCTION__, buckets, atomic_read(&priv->buckets_out)));
1332 	dioprintk((KERN_INFO MYNAM "/%s: Posted %u buckets and received %u back\n",
1333 	__FUNCTION__, priv->total_posted, priv->total_received));
1334 
1335 	clear_bit(0, &priv->post_buckets_active);
1336 }
1337 
1338 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1339 static struct net_device *
1340 mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum)
1341 {
1342 	struct net_device *dev = alloc_fcdev(sizeof(struct mpt_lan_priv));
1343 	struct mpt_lan_priv *priv = NULL;
1344 	u8 HWaddr[FC_ALEN], *a;
1345 
1346 	if (!dev)
1347 		return NULL;
1348 
1349 	dev->mtu = MPT_LAN_MTU;
1350 
1351 	priv = netdev_priv(dev);
1352 
1353 	priv->mpt_dev = mpt_dev;
1354 	priv->pnum = pnum;
1355 
1356 	memset(&priv->post_buckets_task, 0, sizeof(struct work_struct));
1357 	INIT_WORK(&priv->post_buckets_task, mpt_lan_post_receive_buckets, dev);
1358 	priv->post_buckets_active = 0;
1359 
1360 	dlprintk((KERN_INFO MYNAM "@%d: bucketlen = %d\n",
1361 			__LINE__, dev->mtu + dev->hard_header_len + 4));
1362 
1363 	atomic_set(&priv->buckets_out, 0);
1364 	priv->total_posted = 0;
1365 	priv->total_received = 0;
1366 	priv->max_buckets_out = max_buckets_out;
1367 	if (mpt_dev->pfacts[0].MaxLanBuckets < max_buckets_out)
1368 		priv->max_buckets_out = mpt_dev->pfacts[0].MaxLanBuckets;
1369 
1370 	dlprintk((KERN_INFO MYNAM "@%d: MaxLanBuckets=%d, max_buckets_out/priv=%d/%d\n",
1371 			__LINE__,
1372 			mpt_dev->pfacts[0].MaxLanBuckets,
1373 			max_buckets_out,
1374 			priv->max_buckets_out));
1375 
1376 	priv->bucketthresh = priv->max_buckets_out * 2 / 3;
1377 	spin_lock_init(&priv->txfidx_lock);
1378 	spin_lock_init(&priv->rxfidx_lock);
1379 
1380 	memset(&priv->stats, 0, sizeof(priv->stats));
1381 
1382 	/*  Grab pre-fetched LANPage1 stuff. :-) */
1383 	a = (u8 *) &mpt_dev->lan_cnfg_page1.HardwareAddressLow;
1384 
1385 	HWaddr[0] = a[5];
1386 	HWaddr[1] = a[4];
1387 	HWaddr[2] = a[3];
1388 	HWaddr[3] = a[2];
1389 	HWaddr[4] = a[1];
1390 	HWaddr[5] = a[0];
1391 
1392 	dev->addr_len = FC_ALEN;
1393 	memcpy(dev->dev_addr, HWaddr, FC_ALEN);
1394 	memset(dev->broadcast, 0xff, FC_ALEN);
1395 
1396 	/* The Tx queue is 127 deep on the 909.
1397 	 * Give ourselves some breathing room.
1398 	 */
1399 	priv->tx_max_out = (tx_max_out_p <= MPT_TX_MAX_OUT_LIM) ?
1400 			    tx_max_out_p : MPT_TX_MAX_OUT_LIM;
1401 
1402 	dev->open = mpt_lan_open;
1403 	dev->stop = mpt_lan_close;
1404 	dev->get_stats = mpt_lan_get_stats;
1405 	dev->set_multicast_list = NULL;
1406 	dev->change_mtu = mpt_lan_change_mtu;
1407 	dev->hard_start_xmit = mpt_lan_sdu_send;
1408 
1409 /* Not in 2.3.42. Need 2.3.45+ */
1410 	dev->tx_timeout = mpt_lan_tx_timeout;
1411 	dev->watchdog_timeo = MPT_LAN_TX_TIMEOUT;
1412 
1413 	dlprintk((KERN_INFO MYNAM ": Finished registering dev "
1414 		"and setting initial values\n"));
1415 
1416 	SET_MODULE_OWNER(dev);
1417 
1418 	if (register_netdev(dev) != 0) {
1419 		free_netdev(dev);
1420 		dev = NULL;
1421 	}
1422 	return dev;
1423 }
1424 
1425 static int
1426 mptlan_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1427 {
1428 	MPT_ADAPTER 		*ioc = pci_get_drvdata(pdev);
1429 	struct net_device	*dev;
1430 	int			i;
1431 
1432 	for (i = 0; i < ioc->facts.NumberOfPorts; i++) {
1433 		printk(KERN_INFO MYNAM ": %s: PortNum=%x, "
1434 		       "ProtocolFlags=%02Xh (%c%c%c%c)\n",
1435 		       ioc->name, ioc->pfacts[i].PortNumber,
1436 		       ioc->pfacts[i].ProtocolFlags,
1437 		       MPT_PROTOCOL_FLAGS_c_c_c_c(
1438 			       ioc->pfacts[i].ProtocolFlags));
1439 
1440 		if (!(ioc->pfacts[i].ProtocolFlags &
1441 					MPI_PORTFACTS_PROTOCOL_LAN)) {
1442 			printk(KERN_INFO MYNAM ": %s: Hmmm... LAN protocol "
1443 			       "seems to be disabled on this adapter port!\n",
1444 			       ioc->name);
1445 			continue;
1446 		}
1447 
1448 		dev = mpt_register_lan_device(ioc, i);
1449 		if (!dev) {
1450 			printk(KERN_ERR MYNAM ": %s: Unable to register "
1451 			       "port%d as a LAN device\n", ioc->name,
1452 			       ioc->pfacts[i].PortNumber);
1453 			continue;
1454 		}
1455 
1456 		printk(KERN_INFO MYNAM ": %s: Fusion MPT LAN device "
1457 		       "registered as '%s'\n", ioc->name, dev->name);
1458 		printk(KERN_INFO MYNAM ": %s/%s: "
1459 		       "LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n",
1460 		       IOC_AND_NETDEV_NAMES_s_s(dev),
1461 		       dev->dev_addr[0], dev->dev_addr[1],
1462 		       dev->dev_addr[2], dev->dev_addr[3],
1463 		       dev->dev_addr[4], dev->dev_addr[5]);
1464 
1465 		ioc->netdev = dev;
1466 
1467 		return 0;
1468 	}
1469 
1470 	return -ENODEV;
1471 }
1472 
1473 static void
1474 mptlan_remove(struct pci_dev *pdev)
1475 {
1476 	MPT_ADAPTER 		*ioc = pci_get_drvdata(pdev);
1477 	struct net_device	*dev = ioc->netdev;
1478 
1479 	if(dev != NULL) {
1480 		unregister_netdev(dev);
1481 		free_netdev(dev);
1482 	}
1483 }
1484 
1485 static struct mpt_pci_driver mptlan_driver = {
1486 	.probe		= mptlan_probe,
1487 	.remove		= mptlan_remove,
1488 };
1489 
1490 static int __init mpt_lan_init (void)
1491 {
1492 	show_mptmod_ver(LANAME, LANVER);
1493 
1494 	if ((LanCtx = mpt_register(lan_reply, MPTLAN_DRIVER)) <= 0) {
1495 		printk (KERN_ERR MYNAM ": Failed to register with MPT base driver\n");
1496 		return -EBUSY;
1497 	}
1498 
1499 	/* Set the callback index to be used by driver core for turbo replies */
1500 	mpt_lan_index = LanCtx;
1501 
1502 	dlprintk((KERN_INFO MYNAM ": assigned context of %d\n", LanCtx));
1503 
1504 	if (mpt_reset_register(LanCtx, mpt_lan_ioc_reset)) {
1505 		printk(KERN_ERR MYNAM ": Eieee! unable to register a reset "
1506 		       "handler with mptbase! The world is at an end! "
1507 		       "Everything is fading to black! Goodbye.\n");
1508 		return -EBUSY;
1509 	}
1510 
1511 	dlprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n"));
1512 
1513 	if (mpt_device_driver_register(&mptlan_driver, MPTLAN_DRIVER))
1514 		dprintk((KERN_INFO MYNAM ": failed to register dd callbacks\n"));
1515 	return 0;
1516 }
1517 
1518 static void __exit mpt_lan_exit(void)
1519 {
1520 	mpt_device_driver_deregister(MPTLAN_DRIVER);
1521 	mpt_reset_deregister(LanCtx);
1522 
1523 	if (LanCtx >= 0) {
1524 		mpt_deregister(LanCtx);
1525 		LanCtx = -1;
1526 		mpt_lan_index = 0;
1527 	}
1528 }
1529 
1530 module_init(mpt_lan_init);
1531 module_exit(mpt_lan_exit);
1532 
1533 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1534 static unsigned short
1535 mpt_lan_type_trans(struct sk_buff *skb, struct net_device *dev)
1536 {
1537 	struct mpt_lan_ohdr *fch = (struct mpt_lan_ohdr *)skb->data;
1538 	struct fcllc *fcllc;
1539 
1540 	skb->mac.raw = skb->data;
1541 	skb_pull(skb, sizeof(struct mpt_lan_ohdr));
1542 
1543 	if (fch->dtype == htons(0xffff)) {
1544 		u32 *p = (u32 *) fch;
1545 
1546 		swab32s(p + 0);
1547 		swab32s(p + 1);
1548 		swab32s(p + 2);
1549 		swab32s(p + 3);
1550 
1551 		printk (KERN_WARNING MYNAM ": %s: WARNING - Broadcast swap F/W bug detected!\n",
1552 				NETDEV_PTR_TO_IOC_NAME_s(dev));
1553 		printk (KERN_WARNING MYNAM ": Please update sender @ MAC_addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
1554 				fch->saddr[0], fch->saddr[1], fch->saddr[2],
1555 				fch->saddr[3], fch->saddr[4], fch->saddr[5]);
1556 	}
1557 
1558 	if (*fch->daddr & 1) {
1559 		if (!memcmp(fch->daddr, dev->broadcast, FC_ALEN)) {
1560 			skb->pkt_type = PACKET_BROADCAST;
1561 		} else {
1562 			skb->pkt_type = PACKET_MULTICAST;
1563 		}
1564 	} else {
1565 		if (memcmp(fch->daddr, dev->dev_addr, FC_ALEN)) {
1566 			skb->pkt_type = PACKET_OTHERHOST;
1567 		} else {
1568 			skb->pkt_type = PACKET_HOST;
1569 		}
1570 	}
1571 
1572 	fcllc = (struct fcllc *)skb->data;
1573 
1574 #ifdef QLOGIC_NAA_WORKAROUND
1575 {
1576 	u16 source_naa = fch->stype, found = 0;
1577 
1578 	/* Workaround for QLogic not following RFC 2625 in regards to the NAA
1579 	   value. */
1580 
1581 	if ((source_naa & 0xF000) == 0)
1582 		source_naa = swab16(source_naa);
1583 
1584 	if (fcllc->ethertype == htons(ETH_P_ARP))
1585 	    dlprintk ((KERN_INFO "mptlan/type_trans: got arp req/rep w/ naa of "
1586 		      "%04x.\n", source_naa));
1587 
1588 	if ((fcllc->ethertype == htons(ETH_P_ARP)) &&
1589 	   ((source_naa >> 12) !=  MPT_LAN_NAA_RFC2625)){
1590 		struct NAA_Hosed *nh, *prevnh;
1591 		int i;
1592 
1593 		dlprintk ((KERN_INFO "mptlan/type_trans: ARP Req/Rep from "
1594 			  "system with non-RFC 2625 NAA value (%04x).\n",
1595 			  source_naa));
1596 
1597 		write_lock_irq(&bad_naa_lock);
1598 		for (prevnh = nh = mpt_bad_naa; nh != NULL;
1599 		     prevnh=nh, nh=nh->next) {
1600 			if ((nh->ieee[0] == fch->saddr[0]) &&
1601 			    (nh->ieee[1] == fch->saddr[1]) &&
1602 			    (nh->ieee[2] == fch->saddr[2]) &&
1603 			    (nh->ieee[3] == fch->saddr[3]) &&
1604 			    (nh->ieee[4] == fch->saddr[4]) &&
1605 			    (nh->ieee[5] == fch->saddr[5])) {
1606 				found = 1;
1607 				dlprintk ((KERN_INFO "mptlan/type_trans: ARP Re"
1608 					 "q/Rep w/ bad NAA from system already"
1609 					 " in DB.\n"));
1610 				break;
1611 			}
1612 		}
1613 
1614 		if ((!found) && (nh == NULL)) {
1615 
1616 			nh = kmalloc(sizeof(struct NAA_Hosed), GFP_KERNEL);
1617 			dlprintk ((KERN_INFO "mptlan/type_trans: ARP Req/Rep w/"
1618 				 " bad NAA from system not yet in DB.\n"));
1619 
1620 			if (nh != NULL) {
1621 				nh->next = NULL;
1622 				if (!mpt_bad_naa)
1623 					mpt_bad_naa = nh;
1624 				if (prevnh)
1625 					prevnh->next = nh;
1626 
1627 				nh->NAA = source_naa; /* Set the S_NAA value. */
1628 				for (i = 0; i < FC_ALEN; i++)
1629 					nh->ieee[i] = fch->saddr[i];
1630 				dlprintk ((KERN_INFO "Got ARP from %02x:%02x:%02x:%02x:"
1631 					  "%02x:%02x with non-compliant S_NAA value.\n",
1632 					  fch->saddr[0], fch->saddr[1], fch->saddr[2],
1633 					  fch->saddr[3], fch->saddr[4],fch->saddr[5]));
1634 			} else {
1635 				printk (KERN_ERR "mptlan/type_trans: Unable to"
1636 					" kmalloc a NAA_Hosed struct.\n");
1637 			}
1638 		} else if (!found) {
1639 			printk (KERN_ERR "mptlan/type_trans: found not"
1640 				" set, but nh isn't null. Evil "
1641 				"funkiness abounds.\n");
1642 		}
1643 		write_unlock_irq(&bad_naa_lock);
1644 	}
1645 }
1646 #endif
1647 
1648 	/* Strip the SNAP header from ARP packets since we don't
1649 	 * pass them through to the 802.2/SNAP layers.
1650 	 */
1651 	if (fcllc->dsap == EXTENDED_SAP &&
1652 		(fcllc->ethertype == htons(ETH_P_IP) ||
1653 		 fcllc->ethertype == htons(ETH_P_ARP))) {
1654 		skb_pull(skb, sizeof(struct fcllc));
1655 		return fcllc->ethertype;
1656 	}
1657 
1658 	return htons(ETH_P_802_2);
1659 }
1660 
1661 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1662