diff options
Diffstat (limited to 'drivers/scsi/fcoe/libfcoe.c')
-rw-r--r-- | drivers/scsi/fcoe/libfcoe.c | 318 |
1 files changed, 136 insertions, 182 deletions
diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c index e419f486cdb3..5548bf3bb58b 100644 --- a/drivers/scsi/fcoe/libfcoe.c +++ b/drivers/scsi/fcoe/libfcoe.c | |||
@@ -49,6 +49,7 @@ | |||
49 | static int debug_fcoe; | 49 | static int debug_fcoe; |
50 | 50 | ||
51 | #define FCOE_MAX_QUEUE_DEPTH 256 | 51 | #define FCOE_MAX_QUEUE_DEPTH 256 |
52 | #define FCOE_LOW_QUEUE_DEPTH 32 | ||
52 | 53 | ||
53 | /* destination address mode */ | 54 | /* destination address mode */ |
54 | #define FCOE_GW_ADDR_MODE 0x00 | 55 | #define FCOE_GW_ADDR_MODE 0x00 |
@@ -69,8 +70,6 @@ struct fcoe_percpu_s *fcoe_percpu[NR_CPUS]; | |||
69 | 70 | ||
70 | /* Function Prototyes */ | 71 | /* Function Prototyes */ |
71 | static int fcoe_check_wait_queue(struct fc_lport *); | 72 | static int fcoe_check_wait_queue(struct fc_lport *); |
72 | static void fcoe_insert_wait_queue_head(struct fc_lport *, struct sk_buff *); | ||
73 | static void fcoe_insert_wait_queue(struct fc_lport *, struct sk_buff *); | ||
74 | static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *); | 73 | static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *); |
75 | #ifdef CONFIG_HOTPLUG_CPU | 74 | #ifdef CONFIG_HOTPLUG_CPU |
76 | static int fcoe_cpu_callback(struct notifier_block *, ulong, void *); | 75 | static int fcoe_cpu_callback(struct notifier_block *, ulong, void *); |
@@ -91,13 +90,13 @@ static struct notifier_block fcoe_cpu_notifier = { | |||
91 | }; | 90 | }; |
92 | 91 | ||
93 | /** | 92 | /** |
94 | * fcoe_create_percpu_data - creates the associated cpu data | 93 | * fcoe_create_percpu_data() - creates the associated cpu data |
95 | * @cpu: index for the cpu where fcoe cpu data will be created | 94 | * @cpu: index for the cpu where fcoe cpu data will be created |
96 | * | 95 | * |
97 | * create percpu stats block, from cpu add notifier | 96 | * create percpu stats block, from cpu add notifier |
98 | * | 97 | * |
99 | * Returns: none | 98 | * Returns: none |
100 | **/ | 99 | */ |
101 | static void fcoe_create_percpu_data(int cpu) | 100 | static void fcoe_create_percpu_data(int cpu) |
102 | { | 101 | { |
103 | struct fc_lport *lp; | 102 | struct fc_lport *lp; |
@@ -115,13 +114,13 @@ static void fcoe_create_percpu_data(int cpu) | |||
115 | } | 114 | } |
116 | 115 | ||
117 | /** | 116 | /** |
118 | * fcoe_destroy_percpu_data - destroys the associated cpu data | 117 | * fcoe_destroy_percpu_data() - destroys the associated cpu data |
119 | * @cpu: index for the cpu where fcoe cpu data will destroyed | 118 | * @cpu: index for the cpu where fcoe cpu data will destroyed |
120 | * | 119 | * |
121 | * destroy percpu stats block called by cpu add/remove notifier | 120 | * destroy percpu stats block called by cpu add/remove notifier |
122 | * | 121 | * |
123 | * Retuns: none | 122 | * Retuns: none |
124 | **/ | 123 | */ |
125 | static void fcoe_destroy_percpu_data(int cpu) | 124 | static void fcoe_destroy_percpu_data(int cpu) |
126 | { | 125 | { |
127 | struct fc_lport *lp; | 126 | struct fc_lport *lp; |
@@ -137,7 +136,7 @@ static void fcoe_destroy_percpu_data(int cpu) | |||
137 | } | 136 | } |
138 | 137 | ||
139 | /** | 138 | /** |
140 | * fcoe_cpu_callback - fcoe cpu hotplug event callback | 139 | * fcoe_cpu_callback() - fcoe cpu hotplug event callback |
141 | * @nfb: callback data block | 140 | * @nfb: callback data block |
142 | * @action: event triggering the callback | 141 | * @action: event triggering the callback |
143 | * @hcpu: index for the cpu of this event | 142 | * @hcpu: index for the cpu of this event |
@@ -145,7 +144,7 @@ static void fcoe_destroy_percpu_data(int cpu) | |||
145 | * this creates or destroys per cpu data for fcoe | 144 | * this creates or destroys per cpu data for fcoe |
146 | * | 145 | * |
147 | * Returns NOTIFY_OK always. | 146 | * Returns NOTIFY_OK always. |
148 | **/ | 147 | */ |
149 | static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, | 148 | static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, |
150 | void *hcpu) | 149 | void *hcpu) |
151 | { | 150 | { |
@@ -166,7 +165,7 @@ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, | |||
166 | #endif /* CONFIG_HOTPLUG_CPU */ | 165 | #endif /* CONFIG_HOTPLUG_CPU */ |
167 | 166 | ||
168 | /** | 167 | /** |
169 | * fcoe_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ | 168 | * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ |
170 | * @skb: the receive skb | 169 | * @skb: the receive skb |
171 | * @dev: associated net device | 170 | * @dev: associated net device |
172 | * @ptype: context | 171 | * @ptype: context |
@@ -175,7 +174,7 @@ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action, | |||
175 | * this function will receive the packet and build fc frame and pass it up | 174 | * this function will receive the packet and build fc frame and pass it up |
176 | * | 175 | * |
177 | * Returns: 0 for success | 176 | * Returns: 0 for success |
178 | **/ | 177 | */ |
179 | int fcoe_rcv(struct sk_buff *skb, struct net_device *dev, | 178 | int fcoe_rcv(struct sk_buff *skb, struct net_device *dev, |
180 | struct packet_type *ptype, struct net_device *olddev) | 179 | struct packet_type *ptype, struct net_device *olddev) |
181 | { | 180 | { |
@@ -265,11 +264,11 @@ err2: | |||
265 | EXPORT_SYMBOL_GPL(fcoe_rcv); | 264 | EXPORT_SYMBOL_GPL(fcoe_rcv); |
266 | 265 | ||
267 | /** | 266 | /** |
268 | * fcoe_start_io - pass to netdev to start xmit for fcoe | 267 | * fcoe_start_io() - pass to netdev to start xmit for fcoe |
269 | * @skb: the skb to be xmitted | 268 | * @skb: the skb to be xmitted |
270 | * | 269 | * |
271 | * Returns: 0 for success | 270 | * Returns: 0 for success |
272 | **/ | 271 | */ |
273 | static inline int fcoe_start_io(struct sk_buff *skb) | 272 | static inline int fcoe_start_io(struct sk_buff *skb) |
274 | { | 273 | { |
275 | int rc; | 274 | int rc; |
@@ -283,12 +282,12 @@ static inline int fcoe_start_io(struct sk_buff *skb) | |||
283 | } | 282 | } |
284 | 283 | ||
285 | /** | 284 | /** |
286 | * fcoe_get_paged_crc_eof - in case we need alloc a page for crc_eof | 285 | * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof |
287 | * @skb: the skb to be xmitted | 286 | * @skb: the skb to be xmitted |
288 | * @tlen: total len | 287 | * @tlen: total len |
289 | * | 288 | * |
290 | * Returns: 0 for success | 289 | * Returns: 0 for success |
291 | **/ | 290 | */ |
292 | static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen) | 291 | static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen) |
293 | { | 292 | { |
294 | struct fcoe_percpu_s *fps; | 293 | struct fcoe_percpu_s *fps; |
@@ -326,13 +325,12 @@ static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen) | |||
326 | } | 325 | } |
327 | 326 | ||
328 | /** | 327 | /** |
329 | * fcoe_fc_crc - calculates FC CRC in this fcoe skb | 328 | * fcoe_fc_crc() - calculates FC CRC in this fcoe skb |
330 | * @fp: the fc_frame containg data to be checksummed | 329 | * @fp: the fc_frame containg data to be checksummed |
331 | * | 330 | * |
332 | * This uses crc32() to calculate the crc for fc frame | 331 | * This uses crc32() to calculate the crc for fc frame |
333 | * Return : 32 bit crc | 332 | * Return : 32 bit crc |
334 | * | 333 | */ |
335 | **/ | ||
336 | u32 fcoe_fc_crc(struct fc_frame *fp) | 334 | u32 fcoe_fc_crc(struct fc_frame *fp) |
337 | { | 335 | { |
338 | struct sk_buff *skb = fp_skb(fp); | 336 | struct sk_buff *skb = fp_skb(fp); |
@@ -363,13 +361,12 @@ u32 fcoe_fc_crc(struct fc_frame *fp) | |||
363 | EXPORT_SYMBOL_GPL(fcoe_fc_crc); | 361 | EXPORT_SYMBOL_GPL(fcoe_fc_crc); |
364 | 362 | ||
365 | /** | 363 | /** |
366 | * fcoe_xmit - FCoE frame transmit function | 364 | * fcoe_xmit() - FCoE frame transmit function |
367 | * @lp: the associated local port | 365 | * @lp: the associated local port |
368 | * @fp: the fc_frame to be transmitted | 366 | * @fp: the fc_frame to be transmitted |
369 | * | 367 | * |
370 | * Return : 0 for success | 368 | * Return : 0 for success |
371 | * | 369 | */ |
372 | **/ | ||
373 | int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | 370 | int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) |
374 | { | 371 | { |
375 | int wlen, rc = 0; | 372 | int wlen, rc = 0; |
@@ -389,7 +386,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | |||
389 | 386 | ||
390 | WARN_ON((fr_len(fp) % sizeof(u32)) != 0); | 387 | WARN_ON((fr_len(fp) % sizeof(u32)) != 0); |
391 | 388 | ||
392 | fc = fcoe_softc(lp); | 389 | fc = lport_priv(lp); |
393 | /* | 390 | /* |
394 | * if it is a flogi then we need to learn gw-addr | 391 | * if it is a flogi then we need to learn gw-addr |
395 | * and my own fcid | 392 | * and my own fcid |
@@ -439,7 +436,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | |||
439 | if (skb_is_nonlinear(skb)) { | 436 | if (skb_is_nonlinear(skb)) { |
440 | skb_frag_t *frag; | 437 | skb_frag_t *frag; |
441 | if (fcoe_get_paged_crc_eof(skb, tlen)) { | 438 | if (fcoe_get_paged_crc_eof(skb, tlen)) { |
442 | kfree(skb); | 439 | kfree_skb(skb); |
443 | return -ENOMEM; | 440 | return -ENOMEM; |
444 | } | 441 | } |
445 | frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; | 442 | frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; |
@@ -502,21 +499,22 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp) | |||
502 | rc = fcoe_start_io(skb); | 499 | rc = fcoe_start_io(skb); |
503 | 500 | ||
504 | if (rc) { | 501 | if (rc) { |
505 | fcoe_insert_wait_queue(lp, skb); | 502 | spin_lock_bh(&fc->fcoe_pending_queue.lock); |
503 | __skb_queue_tail(&fc->fcoe_pending_queue, skb); | ||
504 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
506 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) | 505 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) |
507 | fc_pause(lp); | 506 | lp->qfull = 1; |
508 | } | 507 | } |
509 | 508 | ||
510 | return 0; | 509 | return 0; |
511 | } | 510 | } |
512 | EXPORT_SYMBOL_GPL(fcoe_xmit); | 511 | EXPORT_SYMBOL_GPL(fcoe_xmit); |
513 | 512 | ||
514 | /* | 513 | /** |
515 | * fcoe_percpu_receive_thread - recv thread per cpu | 514 | * fcoe_percpu_receive_thread() - recv thread per cpu |
516 | * @arg: ptr to the fcoe per cpu struct | 515 | * @arg: ptr to the fcoe per cpu struct |
517 | * | 516 | * |
518 | * Return: 0 for success | 517 | * Return: 0 for success |
519 | * | ||
520 | */ | 518 | */ |
521 | int fcoe_percpu_receive_thread(void *arg) | 519 | int fcoe_percpu_receive_thread(void *arg) |
522 | { | 520 | { |
@@ -533,7 +531,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
533 | struct fcoe_softc *fc; | 531 | struct fcoe_softc *fc; |
534 | struct fcoe_hdr *hp; | 532 | struct fcoe_hdr *hp; |
535 | 533 | ||
536 | set_user_nice(current, 19); | 534 | set_user_nice(current, -20); |
537 | 535 | ||
538 | while (!kthread_should_stop()) { | 536 | while (!kthread_should_stop()) { |
539 | 537 | ||
@@ -658,7 +656,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
658 | } | 656 | } |
659 | 657 | ||
660 | /** | 658 | /** |
661 | * fcoe_recv_flogi - flogi receive function | 659 | * fcoe_recv_flogi() - flogi receive function |
662 | * @fc: associated fcoe_softc | 660 | * @fc: associated fcoe_softc |
663 | * @fp: the recieved frame | 661 | * @fp: the recieved frame |
664 | * @sa: the source address of this flogi | 662 | * @sa: the source address of this flogi |
@@ -667,7 +665,7 @@ int fcoe_percpu_receive_thread(void *arg) | |||
667 | * mac address for the initiator, eitehr OUI based or GW based. | 665 | * mac address for the initiator, eitehr OUI based or GW based. |
668 | * | 666 | * |
669 | * Returns: none | 667 | * Returns: none |
670 | **/ | 668 | */ |
671 | static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa) | 669 | static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa) |
672 | { | 670 | { |
673 | struct fc_frame_header *fh; | 671 | struct fc_frame_header *fh; |
@@ -715,32 +713,23 @@ static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa) | |||
715 | } | 713 | } |
716 | 714 | ||
717 | /** | 715 | /** |
718 | * fcoe_watchdog - fcoe timer callback | 716 | * fcoe_watchdog() - fcoe timer callback |
719 | * @vp: | 717 | * @vp: |
720 | * | 718 | * |
721 | * This checks the pending queue length for fcoe and put fcoe to be paused state | 719 | * This checks the pending queue length for fcoe and set lport qfull |
722 | * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the | 720 | * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the |
723 | * fcoe_hostlist. | 721 | * fcoe_hostlist. |
724 | * | 722 | * |
725 | * Returns: 0 for success | 723 | * Returns: 0 for success |
726 | **/ | 724 | */ |
727 | void fcoe_watchdog(ulong vp) | 725 | void fcoe_watchdog(ulong vp) |
728 | { | 726 | { |
729 | struct fc_lport *lp; | ||
730 | struct fcoe_softc *fc; | 727 | struct fcoe_softc *fc; |
731 | int paused = 0; | ||
732 | 728 | ||
733 | read_lock(&fcoe_hostlist_lock); | 729 | read_lock(&fcoe_hostlist_lock); |
734 | list_for_each_entry(fc, &fcoe_hostlist, list) { | 730 | list_for_each_entry(fc, &fcoe_hostlist, list) { |
735 | lp = fc->lp; | 731 | if (fc->lp) |
736 | if (lp) { | 732 | fcoe_check_wait_queue(fc->lp); |
737 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) | ||
738 | paused = 1; | ||
739 | if (fcoe_check_wait_queue(lp) < FCOE_MAX_QUEUE_DEPTH) { | ||
740 | if (paused) | ||
741 | fc_unpause(lp); | ||
742 | } | ||
743 | } | ||
744 | } | 733 | } |
745 | read_unlock(&fcoe_hostlist_lock); | 734 | read_unlock(&fcoe_hostlist_lock); |
746 | 735 | ||
@@ -750,96 +739,64 @@ void fcoe_watchdog(ulong vp) | |||
750 | 739 | ||
751 | 740 | ||
752 | /** | 741 | /** |
753 | * fcoe_check_wait_queue - put the skb into fcoe pending xmit queue | 742 | * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue |
754 | * @lp: the fc_port for this skb | 743 | * @lp: the fc_port for this skb |
755 | * @skb: the associated skb to be xmitted | 744 | * @skb: the associated skb to be xmitted |
756 | * | 745 | * |
757 | * This empties the wait_queue, dequeue the head of the wait_queue queue | 746 | * This empties the wait_queue, dequeue the head of the wait_queue queue |
758 | * and calls fcoe_start_io() for each packet, if all skb have been | 747 | * and calls fcoe_start_io() for each packet, if all skb have been |
759 | * transmitted, return 0 if a error occurs, then restore wait_queue and | 748 | * transmitted, return qlen or -1 if a error occurs, then restore |
760 | * try again later. | 749 | * wait_queue and try again later. |
761 | * | 750 | * |
762 | * The wait_queue is used when the skb transmit fails. skb will go | 751 | * The wait_queue is used when the skb transmit fails. skb will go |
763 | * in the wait_queue which will be emptied by the time function OR | 752 | * in the wait_queue which will be emptied by the time function OR |
764 | * by the next skb transmit. | 753 | * by the next skb transmit. |
765 | * | 754 | * |
766 | * Returns: 0 for success | 755 | * Returns: 0 for success |
767 | **/ | 756 | */ |
768 | static int fcoe_check_wait_queue(struct fc_lport *lp) | 757 | static int fcoe_check_wait_queue(struct fc_lport *lp) |
769 | { | 758 | { |
770 | int rc, unpause = 0; | 759 | struct fcoe_softc *fc = lport_priv(lp); |
771 | int paused = 0; | ||
772 | struct sk_buff *skb; | 760 | struct sk_buff *skb; |
773 | struct fcoe_softc *fc; | 761 | int rc = -1; |
774 | 762 | ||
775 | fc = fcoe_softc(lp); | ||
776 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | 763 | spin_lock_bh(&fc->fcoe_pending_queue.lock); |
764 | if (fc->fcoe_pending_queue_active) | ||
765 | goto out; | ||
766 | fc->fcoe_pending_queue_active = 1; | ||
777 | 767 | ||
778 | /* | 768 | while (fc->fcoe_pending_queue.qlen) { |
779 | * is this interface paused? | 769 | /* keep qlen > 0 until fcoe_start_io succeeds */ |
780 | */ | 770 | fc->fcoe_pending_queue.qlen++; |
781 | if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) | 771 | skb = __skb_dequeue(&fc->fcoe_pending_queue); |
782 | paused = 1; | ||
783 | if (fc->fcoe_pending_queue.qlen) { | ||
784 | while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) { | ||
785 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
786 | rc = fcoe_start_io(skb); | ||
787 | if (rc) { | ||
788 | fcoe_insert_wait_queue_head(lp, skb); | ||
789 | return rc; | ||
790 | } | ||
791 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | ||
792 | } | ||
793 | if (fc->fcoe_pending_queue.qlen < FCOE_MAX_QUEUE_DEPTH) | ||
794 | unpause = 1; | ||
795 | } | ||
796 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
797 | if ((unpause) && (paused)) | ||
798 | fc_unpause(lp); | ||
799 | return fc->fcoe_pending_queue.qlen; | ||
800 | } | ||
801 | |||
802 | /** | ||
803 | * fcoe_insert_wait_queue_head - puts skb to fcoe pending queue head | ||
804 | * @lp: the fc_port for this skb | ||
805 | * @skb: the associated skb to be xmitted | ||
806 | * | ||
807 | * Returns: none | ||
808 | **/ | ||
809 | static void fcoe_insert_wait_queue_head(struct fc_lport *lp, | ||
810 | struct sk_buff *skb) | ||
811 | { | ||
812 | struct fcoe_softc *fc; | ||
813 | 772 | ||
814 | fc = fcoe_softc(lp); | 773 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); |
815 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | 774 | rc = fcoe_start_io(skb); |
816 | __skb_queue_head(&fc->fcoe_pending_queue, skb); | 775 | spin_lock_bh(&fc->fcoe_pending_queue.lock); |
817 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | ||
818 | } | ||
819 | 776 | ||
820 | /** | 777 | if (rc) { |
821 | * fcoe_insert_wait_queue - put the skb into fcoe pending queue tail | 778 | __skb_queue_head(&fc->fcoe_pending_queue, skb); |
822 | * @lp: the fc_port for this skb | 779 | /* undo temporary increment above */ |
823 | * @skb: the associated skb to be xmitted | 780 | fc->fcoe_pending_queue.qlen--; |
824 | * | 781 | break; |
825 | * Returns: none | 782 | } |
826 | **/ | 783 | /* undo temporary increment above */ |
827 | static void fcoe_insert_wait_queue(struct fc_lport *lp, | 784 | fc->fcoe_pending_queue.qlen--; |
828 | struct sk_buff *skb) | 785 | } |
829 | { | ||
830 | struct fcoe_softc *fc; | ||
831 | 786 | ||
832 | fc = fcoe_softc(lp); | 787 | if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH) |
833 | spin_lock_bh(&fc->fcoe_pending_queue.lock); | 788 | lp->qfull = 0; |
834 | __skb_queue_tail(&fc->fcoe_pending_queue, skb); | 789 | fc->fcoe_pending_queue_active = 0; |
790 | rc = fc->fcoe_pending_queue.qlen; | ||
791 | out: | ||
835 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); | 792 | spin_unlock_bh(&fc->fcoe_pending_queue.lock); |
793 | return rc; | ||
836 | } | 794 | } |
837 | 795 | ||
838 | /** | 796 | /** |
839 | * fcoe_dev_setup - setup link change notification interface | 797 | * fcoe_dev_setup() - setup link change notification interface |
840 | * | 798 | */ |
841 | **/ | 799 | static void fcoe_dev_setup() |
842 | static void fcoe_dev_setup(void) | ||
843 | { | 800 | { |
844 | /* | 801 | /* |
845 | * here setup a interface specific wd time to | 802 | * here setup a interface specific wd time to |
@@ -849,15 +806,15 @@ static void fcoe_dev_setup(void) | |||
849 | } | 806 | } |
850 | 807 | ||
851 | /** | 808 | /** |
852 | * fcoe_dev_setup - cleanup link change notification interface | 809 | * fcoe_dev_setup() - cleanup link change notification interface |
853 | **/ | 810 | */ |
854 | static void fcoe_dev_cleanup(void) | 811 | static void fcoe_dev_cleanup(void) |
855 | { | 812 | { |
856 | unregister_netdevice_notifier(&fcoe_notifier); | 813 | unregister_netdevice_notifier(&fcoe_notifier); |
857 | } | 814 | } |
858 | 815 | ||
859 | /** | 816 | /** |
860 | * fcoe_device_notification - netdev event notification callback | 817 | * fcoe_device_notification() - netdev event notification callback |
861 | * @notifier: context of the notification | 818 | * @notifier: context of the notification |
862 | * @event: type of event | 819 | * @event: type of event |
863 | * @ptr: fixed array for output parsed ifname | 820 | * @ptr: fixed array for output parsed ifname |
@@ -865,7 +822,7 @@ static void fcoe_dev_cleanup(void) | |||
865 | * This function is called by the ethernet driver in case of link change event | 822 | * This function is called by the ethernet driver in case of link change event |
866 | * | 823 | * |
867 | * Returns: 0 for success | 824 | * Returns: 0 for success |
868 | **/ | 825 | */ |
869 | static int fcoe_device_notification(struct notifier_block *notifier, | 826 | static int fcoe_device_notification(struct notifier_block *notifier, |
870 | ulong event, void *ptr) | 827 | ulong event, void *ptr) |
871 | { | 828 | { |
@@ -873,7 +830,7 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
873 | struct net_device *real_dev = ptr; | 830 | struct net_device *real_dev = ptr; |
874 | struct fcoe_softc *fc; | 831 | struct fcoe_softc *fc; |
875 | struct fcoe_dev_stats *stats; | 832 | struct fcoe_dev_stats *stats; |
876 | u16 new_status; | 833 | u32 new_link_up; |
877 | u32 mfs; | 834 | u32 mfs; |
878 | int rc = NOTIFY_OK; | 835 | int rc = NOTIFY_OK; |
879 | 836 | ||
@@ -890,17 +847,15 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
890 | goto out; | 847 | goto out; |
891 | } | 848 | } |
892 | 849 | ||
893 | new_status = lp->link_status; | 850 | new_link_up = lp->link_up; |
894 | switch (event) { | 851 | switch (event) { |
895 | case NETDEV_DOWN: | 852 | case NETDEV_DOWN: |
896 | case NETDEV_GOING_DOWN: | 853 | case NETDEV_GOING_DOWN: |
897 | new_status &= ~FC_LINK_UP; | 854 | new_link_up = 0; |
898 | break; | 855 | break; |
899 | case NETDEV_UP: | 856 | case NETDEV_UP: |
900 | case NETDEV_CHANGE: | 857 | case NETDEV_CHANGE: |
901 | new_status &= ~FC_LINK_UP; | 858 | new_link_up = !fcoe_link_ok(lp); |
902 | if (!fcoe_link_ok(lp)) | ||
903 | new_status |= FC_LINK_UP; | ||
904 | break; | 859 | break; |
905 | case NETDEV_CHANGEMTU: | 860 | case NETDEV_CHANGEMTU: |
906 | mfs = fc->real_dev->mtu - | 861 | mfs = fc->real_dev->mtu - |
@@ -908,17 +863,15 @@ static int fcoe_device_notification(struct notifier_block *notifier, | |||
908 | sizeof(struct fcoe_crc_eof)); | 863 | sizeof(struct fcoe_crc_eof)); |
909 | if (mfs >= FC_MIN_MAX_FRAME) | 864 | if (mfs >= FC_MIN_MAX_FRAME) |
910 | fc_set_mfs(lp, mfs); | 865 | fc_set_mfs(lp, mfs); |
911 | new_status &= ~FC_LINK_UP; | 866 | new_link_up = !fcoe_link_ok(lp); |
912 | if (!fcoe_link_ok(lp)) | ||
913 | new_status |= FC_LINK_UP; | ||
914 | break; | 867 | break; |
915 | case NETDEV_REGISTER: | 868 | case NETDEV_REGISTER: |
916 | break; | 869 | break; |
917 | default: | 870 | default: |
918 | FC_DBG("unknown event %ld call", event); | 871 | FC_DBG("unknown event %ld call", event); |
919 | } | 872 | } |
920 | if (lp->link_status != new_status) { | 873 | if (lp->link_up != new_link_up) { |
921 | if ((new_status & FC_LINK_UP) == FC_LINK_UP) | 874 | if (new_link_up) |
922 | fc_linkup(lp); | 875 | fc_linkup(lp); |
923 | else { | 876 | else { |
924 | stats = lp->dev_stats[smp_processor_id()]; | 877 | stats = lp->dev_stats[smp_processor_id()]; |
@@ -933,12 +886,12 @@ out: | |||
933 | } | 886 | } |
934 | 887 | ||
935 | /** | 888 | /** |
936 | * fcoe_if_to_netdev - parse a name buffer to get netdev | 889 | * fcoe_if_to_netdev() - parse a name buffer to get netdev |
937 | * @ifname: fixed array for output parsed ifname | 890 | * @ifname: fixed array for output parsed ifname |
938 | * @buffer: incoming buffer to be copied | 891 | * @buffer: incoming buffer to be copied |
939 | * | 892 | * |
940 | * Returns: NULL or ptr to netdeive | 893 | * Returns: NULL or ptr to netdeive |
941 | **/ | 894 | */ |
942 | static struct net_device *fcoe_if_to_netdev(const char *buffer) | 895 | static struct net_device *fcoe_if_to_netdev(const char *buffer) |
943 | { | 896 | { |
944 | char *cp; | 897 | char *cp; |
@@ -955,13 +908,13 @@ static struct net_device *fcoe_if_to_netdev(const char *buffer) | |||
955 | } | 908 | } |
956 | 909 | ||
957 | /** | 910 | /** |
958 | * fcoe_netdev_to_module_owner - finds out the nic drive moddule of the netdev | 911 | * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev |
959 | * @netdev: the target netdev | 912 | * @netdev: the target netdev |
960 | * | 913 | * |
961 | * Returns: ptr to the struct module, NULL for failure | 914 | * Returns: ptr to the struct module, NULL for failure |
962 | **/ | 915 | */ |
963 | static struct module *fcoe_netdev_to_module_owner( | 916 | static struct module * |
964 | const struct net_device *netdev) | 917 | fcoe_netdev_to_module_owner(const struct net_device *netdev) |
965 | { | 918 | { |
966 | struct device *dev; | 919 | struct device *dev; |
967 | 920 | ||
@@ -979,12 +932,14 @@ static struct module *fcoe_netdev_to_module_owner( | |||
979 | } | 932 | } |
980 | 933 | ||
981 | /** | 934 | /** |
982 | * fcoe_ethdrv_get - holds the nic driver module by try_module_get() for | 935 | * fcoe_ethdrv_get() - Hold the Ethernet driver |
983 | * the corresponding netdev. | ||
984 | * @netdev: the target netdev | 936 | * @netdev: the target netdev |
985 | * | 937 | * |
938 | * Holds the Ethernet driver module by try_module_get() for | ||
939 | * the corresponding netdev. | ||
940 | * | ||
986 | * Returns: 0 for succsss | 941 | * Returns: 0 for succsss |
987 | **/ | 942 | */ |
988 | static int fcoe_ethdrv_get(const struct net_device *netdev) | 943 | static int fcoe_ethdrv_get(const struct net_device *netdev) |
989 | { | 944 | { |
990 | struct module *owner; | 945 | struct module *owner; |
@@ -999,12 +954,14 @@ static int fcoe_ethdrv_get(const struct net_device *netdev) | |||
999 | } | 954 | } |
1000 | 955 | ||
1001 | /** | 956 | /** |
1002 | * fcoe_ethdrv_get - releases the nic driver module by module_put for | 957 | * fcoe_ethdrv_put() - Release the Ethernet driver |
1003 | * the corresponding netdev. | ||
1004 | * @netdev: the target netdev | 958 | * @netdev: the target netdev |
1005 | * | 959 | * |
960 | * Releases the Ethernet driver module by module_put for | ||
961 | * the corresponding netdev. | ||
962 | * | ||
1006 | * Returns: 0 for succsss | 963 | * Returns: 0 for succsss |
1007 | **/ | 964 | */ |
1008 | static int fcoe_ethdrv_put(const struct net_device *netdev) | 965 | static int fcoe_ethdrv_put(const struct net_device *netdev) |
1009 | { | 966 | { |
1010 | struct module *owner; | 967 | struct module *owner; |
@@ -1020,12 +977,12 @@ static int fcoe_ethdrv_put(const struct net_device *netdev) | |||
1020 | } | 977 | } |
1021 | 978 | ||
1022 | /** | 979 | /** |
1023 | * fcoe_destroy- handles the destroy from sysfs | 980 | * fcoe_destroy() - handles the destroy from sysfs |
1024 | * @buffer: expcted to be a eth if name | 981 | * @buffer: expcted to be a eth if name |
1025 | * @kp: associated kernel param | 982 | * @kp: associated kernel param |
1026 | * | 983 | * |
1027 | * Returns: 0 for success | 984 | * Returns: 0 for success |
1028 | **/ | 985 | */ |
1029 | static int fcoe_destroy(const char *buffer, struct kernel_param *kp) | 986 | static int fcoe_destroy(const char *buffer, struct kernel_param *kp) |
1030 | { | 987 | { |
1031 | int rc; | 988 | int rc; |
@@ -1058,12 +1015,12 @@ out_nodev: | |||
1058 | } | 1015 | } |
1059 | 1016 | ||
1060 | /** | 1017 | /** |
1061 | * fcoe_create - handles the create call from sysfs | 1018 | * fcoe_create() - Handles the create call from sysfs |
1062 | * @buffer: expcted to be a eth if name | 1019 | * @buffer: expcted to be a eth if name |
1063 | * @kp: associated kernel param | 1020 | * @kp: associated kernel param |
1064 | * | 1021 | * |
1065 | * Returns: 0 for success | 1022 | * Returns: 0 for success |
1066 | **/ | 1023 | */ |
1067 | static int fcoe_create(const char *buffer, struct kernel_param *kp) | 1024 | static int fcoe_create(const char *buffer, struct kernel_param *kp) |
1068 | { | 1025 | { |
1069 | int rc; | 1026 | int rc; |
@@ -1104,8 +1061,8 @@ module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR); | |||
1104 | __MODULE_PARM_TYPE(destroy, "string"); | 1061 | __MODULE_PARM_TYPE(destroy, "string"); |
1105 | MODULE_PARM_DESC(destroy, "Destroy fcoe port"); | 1062 | MODULE_PARM_DESC(destroy, "Destroy fcoe port"); |
1106 | 1063 | ||
1107 | /* | 1064 | /** |
1108 | * fcoe_link_ok - check if link is ok for the fc_lport | 1065 | * fcoe_link_ok() - Check if link is ok for the fc_lport |
1109 | * @lp: ptr to the fc_lport | 1066 | * @lp: ptr to the fc_lport |
1110 | * | 1067 | * |
1111 | * Any permanently-disqualifying conditions have been previously checked. | 1068 | * Any permanently-disqualifying conditions have been previously checked. |
@@ -1120,7 +1077,7 @@ MODULE_PARM_DESC(destroy, "Destroy fcoe port"); | |||
1120 | */ | 1077 | */ |
1121 | int fcoe_link_ok(struct fc_lport *lp) | 1078 | int fcoe_link_ok(struct fc_lport *lp) |
1122 | { | 1079 | { |
1123 | struct fcoe_softc *fc = fcoe_softc(lp); | 1080 | struct fcoe_softc *fc = lport_priv(lp); |
1124 | struct net_device *dev = fc->real_dev; | 1081 | struct net_device *dev = fc->real_dev; |
1125 | struct ethtool_cmd ecmd = { ETHTOOL_GSET }; | 1082 | struct ethtool_cmd ecmd = { ETHTOOL_GSET }; |
1126 | int rc = 0; | 1083 | int rc = 0; |
@@ -1149,9 +1106,8 @@ int fcoe_link_ok(struct fc_lport *lp) | |||
1149 | } | 1106 | } |
1150 | EXPORT_SYMBOL_GPL(fcoe_link_ok); | 1107 | EXPORT_SYMBOL_GPL(fcoe_link_ok); |
1151 | 1108 | ||
1152 | /* | 1109 | /** |
1153 | * fcoe_percpu_clean - frees skb of the corresponding lport from the per | 1110 | * fcoe_percpu_clean() - Clear the pending skbs for an lport |
1154 | * cpu queue. | ||
1155 | * @lp: the fc_lport | 1111 | * @lp: the fc_lport |
1156 | */ | 1112 | */ |
1157 | void fcoe_percpu_clean(struct fc_lport *lp) | 1113 | void fcoe_percpu_clean(struct fc_lport *lp) |
@@ -1185,11 +1141,11 @@ void fcoe_percpu_clean(struct fc_lport *lp) | |||
1185 | EXPORT_SYMBOL_GPL(fcoe_percpu_clean); | 1141 | EXPORT_SYMBOL_GPL(fcoe_percpu_clean); |
1186 | 1142 | ||
1187 | /** | 1143 | /** |
1188 | * fcoe_clean_pending_queue - dequeue skb and free it | 1144 | * fcoe_clean_pending_queue() - Dequeue a skb and free it |
1189 | * @lp: the corresponding fc_lport | 1145 | * @lp: the corresponding fc_lport |
1190 | * | 1146 | * |
1191 | * Returns: none | 1147 | * Returns: none |
1192 | **/ | 1148 | */ |
1193 | void fcoe_clean_pending_queue(struct fc_lport *lp) | 1149 | void fcoe_clean_pending_queue(struct fc_lport *lp) |
1194 | { | 1150 | { |
1195 | struct fcoe_softc *fc = lport_priv(lp); | 1151 | struct fcoe_softc *fc = lport_priv(lp); |
@@ -1206,21 +1162,21 @@ void fcoe_clean_pending_queue(struct fc_lport *lp) | |||
1206 | EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue); | 1162 | EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue); |
1207 | 1163 | ||
1208 | /** | 1164 | /** |
1209 | * libfc_host_alloc - allocate a Scsi_Host with room for the fc_lport | 1165 | * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport |
1210 | * @sht: ptr to the scsi host templ | 1166 | * @sht: ptr to the scsi host templ |
1211 | * @priv_size: size of private data after fc_lport | 1167 | * @priv_size: size of private data after fc_lport |
1212 | * | 1168 | * |
1213 | * Returns: ptr to Scsi_Host | 1169 | * Returns: ptr to Scsi_Host |
1214 | * TODO - to libfc? | 1170 | * TODO: to libfc? |
1215 | */ | 1171 | */ |
1216 | static inline struct Scsi_Host *libfc_host_alloc( | 1172 | static inline struct Scsi_Host * |
1217 | struct scsi_host_template *sht, int priv_size) | 1173 | libfc_host_alloc(struct scsi_host_template *sht, int priv_size) |
1218 | { | 1174 | { |
1219 | return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size); | 1175 | return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size); |
1220 | } | 1176 | } |
1221 | 1177 | ||
1222 | /** | 1178 | /** |
1223 | * fcoe_host_alloc - allocate a Scsi_Host with room for the fcoe_softc | 1179 | * fcoe_host_alloc() - Allocate a Scsi_Host with room for the fcoe_softc |
1224 | * @sht: ptr to the scsi host templ | 1180 | * @sht: ptr to the scsi host templ |
1225 | * @priv_size: size of private data after fc_lport | 1181 | * @priv_size: size of private data after fc_lport |
1226 | * | 1182 | * |
@@ -1232,8 +1188,8 @@ struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *sht, int priv_size) | |||
1232 | } | 1188 | } |
1233 | EXPORT_SYMBOL_GPL(fcoe_host_alloc); | 1189 | EXPORT_SYMBOL_GPL(fcoe_host_alloc); |
1234 | 1190 | ||
1235 | /* | 1191 | /** |
1236 | * fcoe_reset - resets the fcoe | 1192 | * fcoe_reset() - Resets the fcoe |
1237 | * @shost: shost the reset is from | 1193 | * @shost: shost the reset is from |
1238 | * | 1194 | * |
1239 | * Returns: always 0 | 1195 | * Returns: always 0 |
@@ -1246,8 +1202,8 @@ int fcoe_reset(struct Scsi_Host *shost) | |||
1246 | } | 1202 | } |
1247 | EXPORT_SYMBOL_GPL(fcoe_reset); | 1203 | EXPORT_SYMBOL_GPL(fcoe_reset); |
1248 | 1204 | ||
1249 | /* | 1205 | /** |
1250 | * fcoe_wwn_from_mac - converts 48-bit IEEE MAC address to 64-bit FC WWN. | 1206 | * fcoe_wwn_from_mac() - Converts 48-bit IEEE MAC address to 64-bit FC WWN. |
1251 | * @mac: mac address | 1207 | * @mac: mac address |
1252 | * @scheme: check port | 1208 | * @scheme: check port |
1253 | * @port: port indicator for converting | 1209 | * @port: port indicator for converting |
@@ -1286,14 +1242,15 @@ u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], | |||
1286 | return wwn; | 1242 | return wwn; |
1287 | } | 1243 | } |
1288 | EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); | 1244 | EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); |
1289 | /* | 1245 | |
1290 | * fcoe_hostlist_lookup_softc - find the corresponding lport by a given device | 1246 | /** |
1247 | * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device | ||
1291 | * @device: this is currently ptr to net_device | 1248 | * @device: this is currently ptr to net_device |
1292 | * | 1249 | * |
1293 | * Returns: NULL or the located fcoe_softc | 1250 | * Returns: NULL or the located fcoe_softc |
1294 | */ | 1251 | */ |
1295 | static struct fcoe_softc *fcoe_hostlist_lookup_softc( | 1252 | static struct fcoe_softc * |
1296 | const struct net_device *dev) | 1253 | fcoe_hostlist_lookup_softc(const struct net_device *dev) |
1297 | { | 1254 | { |
1298 | struct fcoe_softc *fc; | 1255 | struct fcoe_softc *fc; |
1299 | 1256 | ||
@@ -1308,8 +1265,8 @@ static struct fcoe_softc *fcoe_hostlist_lookup_softc( | |||
1308 | return NULL; | 1265 | return NULL; |
1309 | } | 1266 | } |
1310 | 1267 | ||
1311 | /* | 1268 | /** |
1312 | * fcoe_hostlist_lookup - find the corresponding lport by netdev | 1269 | * fcoe_hostlist_lookup() - Find the corresponding lport by netdev |
1313 | * @netdev: ptr to net_device | 1270 | * @netdev: ptr to net_device |
1314 | * | 1271 | * |
1315 | * Returns: 0 for success | 1272 | * Returns: 0 for success |
@@ -1324,8 +1281,8 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev) | |||
1324 | } | 1281 | } |
1325 | EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup); | 1282 | EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup); |
1326 | 1283 | ||
1327 | /* | 1284 | /** |
1328 | * fcoe_hostlist_add - add a lport to lports list | 1285 | * fcoe_hostlist_add() - Add a lport to lports list |
1329 | * @lp: ptr to the fc_lport to badded | 1286 | * @lp: ptr to the fc_lport to badded |
1330 | * | 1287 | * |
1331 | * Returns: 0 for success | 1288 | * Returns: 0 for success |
@@ -1336,7 +1293,7 @@ int fcoe_hostlist_add(const struct fc_lport *lp) | |||
1336 | 1293 | ||
1337 | fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp)); | 1294 | fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp)); |
1338 | if (!fc) { | 1295 | if (!fc) { |
1339 | fc = fcoe_softc(lp); | 1296 | fc = lport_priv(lp); |
1340 | write_lock_bh(&fcoe_hostlist_lock); | 1297 | write_lock_bh(&fcoe_hostlist_lock); |
1341 | list_add_tail(&fc->list, &fcoe_hostlist); | 1298 | list_add_tail(&fc->list, &fcoe_hostlist); |
1342 | write_unlock_bh(&fcoe_hostlist_lock); | 1299 | write_unlock_bh(&fcoe_hostlist_lock); |
@@ -1345,8 +1302,8 @@ int fcoe_hostlist_add(const struct fc_lport *lp) | |||
1345 | } | 1302 | } |
1346 | EXPORT_SYMBOL_GPL(fcoe_hostlist_add); | 1303 | EXPORT_SYMBOL_GPL(fcoe_hostlist_add); |
1347 | 1304 | ||
1348 | /* | 1305 | /** |
1349 | * fcoe_hostlist_remove - remove a lport from lports list | 1306 | * fcoe_hostlist_remove() - remove a lport from lports list |
1350 | * @lp: ptr to the fc_lport to badded | 1307 | * @lp: ptr to the fc_lport to badded |
1351 | * | 1308 | * |
1352 | * Returns: 0 for success | 1309 | * Returns: 0 for success |
@@ -1366,12 +1323,12 @@ int fcoe_hostlist_remove(const struct fc_lport *lp) | |||
1366 | EXPORT_SYMBOL_GPL(fcoe_hostlist_remove); | 1323 | EXPORT_SYMBOL_GPL(fcoe_hostlist_remove); |
1367 | 1324 | ||
1368 | /** | 1325 | /** |
1369 | * fcoe_libfc_config - sets up libfc related properties for lport | 1326 | * fcoe_libfc_config() - sets up libfc related properties for lport |
1370 | * @lp: ptr to the fc_lport | 1327 | * @lp: ptr to the fc_lport |
1371 | * @tt: libfc function template | 1328 | * @tt: libfc function template |
1372 | * | 1329 | * |
1373 | * Returns : 0 for success | 1330 | * Returns : 0 for success |
1374 | **/ | 1331 | */ |
1375 | int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt) | 1332 | int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt) |
1376 | { | 1333 | { |
1377 | /* Set the function pointers set by the LLDD */ | 1334 | /* Set the function pointers set by the LLDD */ |
@@ -1389,14 +1346,14 @@ int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt) | |||
1389 | EXPORT_SYMBOL_GPL(fcoe_libfc_config); | 1346 | EXPORT_SYMBOL_GPL(fcoe_libfc_config); |
1390 | 1347 | ||
1391 | /** | 1348 | /** |
1392 | * fcoe_init - fcoe module loading initialization | 1349 | * fcoe_init() - fcoe module loading initialization |
1393 | * | 1350 | * |
1394 | * Initialization routine | 1351 | * Initialization routine |
1395 | * 1. Will create fc transport software structure | 1352 | * 1. Will create fc transport software structure |
1396 | * 2. initialize the link list of port information structure | 1353 | * 2. initialize the link list of port information structure |
1397 | * | 1354 | * |
1398 | * Returns 0 on success, negative on failure | 1355 | * Returns 0 on success, negative on failure |
1399 | **/ | 1356 | */ |
1400 | static int __init fcoe_init(void) | 1357 | static int __init fcoe_init(void) |
1401 | { | 1358 | { |
1402 | int cpu; | 1359 | int cpu; |
@@ -1433,7 +1390,6 @@ static int __init fcoe_init(void) | |||
1433 | } else { | 1390 | } else { |
1434 | fcoe_percpu[cpu] = NULL; | 1391 | fcoe_percpu[cpu] = NULL; |
1435 | kfree(p); | 1392 | kfree(p); |
1436 | |||
1437 | } | 1393 | } |
1438 | } | 1394 | } |
1439 | } | 1395 | } |
@@ -1443,11 +1399,9 @@ static int __init fcoe_init(void) | |||
1443 | */ | 1399 | */ |
1444 | fcoe_dev_setup(); | 1400 | fcoe_dev_setup(); |
1445 | 1401 | ||
1446 | init_timer(&fcoe_timer); | 1402 | setup_timer(&fcoe_timer, fcoe_watchdog, 0); |
1447 | fcoe_timer.data = 0; | 1403 | |
1448 | fcoe_timer.function = fcoe_watchdog; | 1404 | mod_timer(&fcoe_timer, jiffies + (10 * HZ)); |
1449 | fcoe_timer.expires = (jiffies + (10 * HZ)); | ||
1450 | add_timer(&fcoe_timer); | ||
1451 | 1405 | ||
1452 | /* initiatlize the fcoe transport */ | 1406 | /* initiatlize the fcoe transport */ |
1453 | fcoe_transport_init(); | 1407 | fcoe_transport_init(); |
@@ -1459,10 +1413,10 @@ static int __init fcoe_init(void) | |||
1459 | module_init(fcoe_init); | 1413 | module_init(fcoe_init); |
1460 | 1414 | ||
1461 | /** | 1415 | /** |
1462 | * fcoe_exit - fcoe module unloading cleanup | 1416 | * fcoe_exit() - fcoe module unloading cleanup |
1463 | * | 1417 | * |
1464 | * Returns 0 on success, negative on failure | 1418 | * Returns 0 on success, negative on failure |
1465 | **/ | 1419 | */ |
1466 | static void __exit fcoe_exit(void) | 1420 | static void __exit fcoe_exit(void) |
1467 | { | 1421 | { |
1468 | u32 idx; | 1422 | u32 idx; |
@@ -1483,7 +1437,7 @@ static void __exit fcoe_exit(void) | |||
1483 | */ | 1437 | */ |
1484 | del_timer_sync(&fcoe_timer); | 1438 | del_timer_sync(&fcoe_timer); |
1485 | 1439 | ||
1486 | /* releases the assocaited fcoe transport for each lport */ | 1440 | /* releases the associated fcoe transport for each lport */ |
1487 | list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list) | 1441 | list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list) |
1488 | fcoe_transport_release(fc->real_dev); | 1442 | fcoe_transport_release(fc->real_dev); |
1489 | 1443 | ||