diff options
Diffstat (limited to 'drivers/net')
75 files changed, 2892 insertions, 303 deletions
diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c index d84f6e8903a..5b732988d49 100644 --- a/drivers/net/3c503.c +++ b/drivers/net/3c503.c | |||
@@ -412,7 +412,7 @@ el2_open(struct net_device *dev) | |||
412 | outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); | 412 | outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); |
413 | outb_p(0x00, E33G_IDCFR); | 413 | outb_p(0x00, E33G_IDCFR); |
414 | msleep(1); | 414 | msleep(1); |
415 | free_irq(*irqp, el2_probe_interrupt); | 415 | free_irq(*irqp, &seen); |
416 | if (!seen) | 416 | if (!seen) |
417 | continue; | 417 | continue; |
418 | 418 | ||
@@ -422,6 +422,7 @@ el2_open(struct net_device *dev) | |||
422 | continue; | 422 | continue; |
423 | if (retval < 0) | 423 | if (retval < 0) |
424 | goto err_disable; | 424 | goto err_disable; |
425 | break; | ||
425 | } while (*++irqp); | 426 | } while (*++irqp); |
426 | 427 | ||
427 | if (*irqp == 0) { | 428 | if (*irqp == 0) { |
diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c index 5f25889e27e..44b28b2d700 100644 --- a/drivers/net/3c509.c +++ b/drivers/net/3c509.c | |||
@@ -185,7 +185,7 @@ static int max_interrupt_work = 10; | |||
185 | static int nopnp; | 185 | static int nopnp; |
186 | #endif | 186 | #endif |
187 | 187 | ||
188 | static int el3_common_init(struct net_device *dev); | 188 | static int __devinit el3_common_init(struct net_device *dev); |
189 | static void el3_common_remove(struct net_device *dev); | 189 | static void el3_common_remove(struct net_device *dev); |
190 | static ushort id_read_eeprom(int index); | 190 | static ushort id_read_eeprom(int index); |
191 | static ushort read_eeprom(int ioaddr, int index); | 191 | static ushort read_eeprom(int ioaddr, int index); |
@@ -395,7 +395,7 @@ static struct isa_driver el3_isa_driver = { | |||
395 | static int isa_registered; | 395 | static int isa_registered; |
396 | 396 | ||
397 | #ifdef CONFIG_PNP | 397 | #ifdef CONFIG_PNP |
398 | static const struct pnp_device_id el3_pnp_ids[] __devinitconst = { | 398 | static struct pnp_device_id el3_pnp_ids[] = { |
399 | { .id = "TCM5090" }, /* 3Com Etherlink III (TP) */ | 399 | { .id = "TCM5090" }, /* 3Com Etherlink III (TP) */ |
400 | { .id = "TCM5091" }, /* 3Com Etherlink III */ | 400 | { .id = "TCM5091" }, /* 3Com Etherlink III */ |
401 | { .id = "TCM5094" }, /* 3Com Etherlink III (combo) */ | 401 | { .id = "TCM5094" }, /* 3Com Etherlink III (combo) */ |
@@ -478,7 +478,7 @@ static int pnp_registered; | |||
478 | #endif /* CONFIG_PNP */ | 478 | #endif /* CONFIG_PNP */ |
479 | 479 | ||
480 | #ifdef CONFIG_EISA | 480 | #ifdef CONFIG_EISA |
481 | static const struct eisa_device_id el3_eisa_ids[] __devinitconst = { | 481 | static struct eisa_device_id el3_eisa_ids[] = { |
482 | { "TCM5090" }, | 482 | { "TCM5090" }, |
483 | { "TCM5091" }, | 483 | { "TCM5091" }, |
484 | { "TCM5092" }, | 484 | { "TCM5092" }, |
@@ -508,7 +508,7 @@ static int eisa_registered; | |||
508 | #ifdef CONFIG_MCA | 508 | #ifdef CONFIG_MCA |
509 | static int el3_mca_probe(struct device *dev); | 509 | static int el3_mca_probe(struct device *dev); |
510 | 510 | ||
511 | static const short el3_mca_adapter_ids[] __devinitconst = { | 511 | static short el3_mca_adapter_ids[] __initdata = { |
512 | 0x627c, | 512 | 0x627c, |
513 | 0x627d, | 513 | 0x627d, |
514 | 0x62db, | 514 | 0x62db, |
@@ -517,7 +517,7 @@ static const short el3_mca_adapter_ids[] __devinitconst = { | |||
517 | 0x0000 | 517 | 0x0000 |
518 | }; | 518 | }; |
519 | 519 | ||
520 | static const char *const el3_mca_adapter_names[] __devinitconst = { | 520 | static char *el3_mca_adapter_names[] __initdata = { |
521 | "3Com 3c529 EtherLink III (10base2)", | 521 | "3Com 3c529 EtherLink III (10base2)", |
522 | "3Com 3c529 EtherLink III (10baseT)", | 522 | "3Com 3c529 EtherLink III (10baseT)", |
523 | "3Com 3c529 EtherLink III (test mode)", | 523 | "3Com 3c529 EtherLink III (test mode)", |
@@ -601,7 +601,7 @@ static void el3_common_remove (struct net_device *dev) | |||
601 | } | 601 | } |
602 | 602 | ||
603 | #ifdef CONFIG_MCA | 603 | #ifdef CONFIG_MCA |
604 | static int __devinit el3_mca_probe(struct device *device) | 604 | static int __init el3_mca_probe(struct device *device) |
605 | { | 605 | { |
606 | /* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, | 606 | /* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch, |
607 | * heavily modified by Chris Beauregard | 607 | * heavily modified by Chris Beauregard |
@@ -671,7 +671,7 @@ static int __devinit el3_mca_probe(struct device *device) | |||
671 | #endif /* CONFIG_MCA */ | 671 | #endif /* CONFIG_MCA */ |
672 | 672 | ||
673 | #ifdef CONFIG_EISA | 673 | #ifdef CONFIG_EISA |
674 | static int __devinit el3_eisa_probe (struct device *device) | 674 | static int __init el3_eisa_probe (struct device *device) |
675 | { | 675 | { |
676 | short i; | 676 | short i; |
677 | int ioaddr, irq, if_port; | 677 | int ioaddr, irq, if_port; |
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 99f43d27544..8cc22568ebd 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
@@ -901,14 +901,14 @@ static const struct dev_pm_ops vortex_pm_ops = { | |||
901 | #endif /* !CONFIG_PM */ | 901 | #endif /* !CONFIG_PM */ |
902 | 902 | ||
903 | #ifdef CONFIG_EISA | 903 | #ifdef CONFIG_EISA |
904 | static const struct eisa_device_id vortex_eisa_ids[] __devinitconst = { | 904 | static struct eisa_device_id vortex_eisa_ids[] = { |
905 | { "TCM5920", CH_3C592 }, | 905 | { "TCM5920", CH_3C592 }, |
906 | { "TCM5970", CH_3C597 }, | 906 | { "TCM5970", CH_3C597 }, |
907 | { "" } | 907 | { "" } |
908 | }; | 908 | }; |
909 | MODULE_DEVICE_TABLE(eisa, vortex_eisa_ids); | 909 | MODULE_DEVICE_TABLE(eisa, vortex_eisa_ids); |
910 | 910 | ||
911 | static int __devinit vortex_eisa_probe(struct device *device) | 911 | static int __init vortex_eisa_probe(struct device *device) |
912 | { | 912 | { |
913 | void __iomem *ioaddr; | 913 | void __iomem *ioaddr; |
914 | struct eisa_device *edev; | 914 | struct eisa_device *edev; |
diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 209fbb70619..776a478e629 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile | |||
@@ -31,6 +31,7 @@ obj-$(CONFIG_ATL2) += atlx/ | |||
31 | obj-$(CONFIG_ATL1E) += atl1e/ | 31 | obj-$(CONFIG_ATL1E) += atl1e/ |
32 | obj-$(CONFIG_ATL1C) += atl1c/ | 32 | obj-$(CONFIG_ATL1C) += atl1c/ |
33 | obj-$(CONFIG_GIANFAR) += gianfar_driver.o | 33 | obj-$(CONFIG_GIANFAR) += gianfar_driver.o |
34 | obj-$(CONFIG_PTP_1588_CLOCK_GIANFAR) += gianfar_ptp.o | ||
34 | obj-$(CONFIG_TEHUTI) += tehuti.o | 35 | obj-$(CONFIG_TEHUTI) += tehuti.o |
35 | obj-$(CONFIG_ENIC) += enic/ | 36 | obj-$(CONFIG_ENIC) += enic/ |
36 | obj-$(CONFIG_JME) += jme.o | 37 | obj-$(CONFIG_JME) += jme.o |
diff --git a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c index 0c9217f48b7..7b3e23f3891 100644 --- a/drivers/net/arm/am79c961a.c +++ b/drivers/net/arm/am79c961a.c | |||
@@ -50,7 +50,7 @@ static const char version[] = | |||
50 | #ifdef __arm__ | 50 | #ifdef __arm__ |
51 | static void write_rreg(u_long base, u_int reg, u_int val) | 51 | static void write_rreg(u_long base, u_int reg, u_int val) |
52 | { | 52 | { |
53 | __asm__( | 53 | asm volatile( |
54 | "str%?h %1, [%2] @ NET_RAP\n\t" | 54 | "str%?h %1, [%2] @ NET_RAP\n\t" |
55 | "str%?h %0, [%2, #-4] @ NET_RDP" | 55 | "str%?h %0, [%2, #-4] @ NET_RDP" |
56 | : | 56 | : |
@@ -60,7 +60,7 @@ static void write_rreg(u_long base, u_int reg, u_int val) | |||
60 | static inline unsigned short read_rreg(u_long base_addr, u_int reg) | 60 | static inline unsigned short read_rreg(u_long base_addr, u_int reg) |
61 | { | 61 | { |
62 | unsigned short v; | 62 | unsigned short v; |
63 | __asm__( | 63 | asm volatile( |
64 | "str%?h %1, [%2] @ NET_RAP\n\t" | 64 | "str%?h %1, [%2] @ NET_RAP\n\t" |
65 | "ldr%?h %0, [%2, #-4] @ NET_RDP" | 65 | "ldr%?h %0, [%2, #-4] @ NET_RDP" |
66 | : "=r" (v) | 66 | : "=r" (v) |
@@ -70,7 +70,7 @@ static inline unsigned short read_rreg(u_long base_addr, u_int reg) | |||
70 | 70 | ||
71 | static inline void write_ireg(u_long base, u_int reg, u_int val) | 71 | static inline void write_ireg(u_long base, u_int reg, u_int val) |
72 | { | 72 | { |
73 | __asm__( | 73 | asm volatile( |
74 | "str%?h %1, [%2] @ NET_RAP\n\t" | 74 | "str%?h %1, [%2] @ NET_RAP\n\t" |
75 | "str%?h %0, [%2, #8] @ NET_IDP" | 75 | "str%?h %0, [%2, #8] @ NET_IDP" |
76 | : | 76 | : |
@@ -80,7 +80,7 @@ static inline void write_ireg(u_long base, u_int reg, u_int val) | |||
80 | static inline unsigned short read_ireg(u_long base_addr, u_int reg) | 80 | static inline unsigned short read_ireg(u_long base_addr, u_int reg) |
81 | { | 81 | { |
82 | u_short v; | 82 | u_short v; |
83 | __asm__( | 83 | asm volatile( |
84 | "str%?h %1, [%2] @ NAT_RAP\n\t" | 84 | "str%?h %1, [%2] @ NAT_RAP\n\t" |
85 | "ldr%?h %0, [%2, #8] @ NET_IDP\n\t" | 85 | "ldr%?h %0, [%2, #8] @ NET_IDP\n\t" |
86 | : "=r" (v) | 86 | : "=r" (v) |
@@ -91,47 +91,48 @@ static inline unsigned short read_ireg(u_long base_addr, u_int reg) | |||
91 | #define am_writeword(dev,off,val) __raw_writew(val, ISAMEM_BASE + ((off) << 1)) | 91 | #define am_writeword(dev,off,val) __raw_writew(val, ISAMEM_BASE + ((off) << 1)) |
92 | #define am_readword(dev,off) __raw_readw(ISAMEM_BASE + ((off) << 1)) | 92 | #define am_readword(dev,off) __raw_readw(ISAMEM_BASE + ((off) << 1)) |
93 | 93 | ||
94 | static inline void | 94 | static void |
95 | am_writebuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) | 95 | am_writebuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) |
96 | { | 96 | { |
97 | offset = ISAMEM_BASE + (offset << 1); | 97 | offset = ISAMEM_BASE + (offset << 1); |
98 | length = (length + 1) & ~1; | 98 | length = (length + 1) & ~1; |
99 | if ((int)buf & 2) { | 99 | if ((int)buf & 2) { |
100 | __asm__ __volatile__("str%?h %2, [%0], #4" | 100 | asm volatile("str%?h %2, [%0], #4" |
101 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); | 101 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); |
102 | buf += 2; | 102 | buf += 2; |
103 | length -= 2; | 103 | length -= 2; |
104 | } | 104 | } |
105 | while (length > 8) { | 105 | while (length > 8) { |
106 | unsigned int tmp, tmp2; | 106 | register unsigned int tmp asm("r2"), tmp2 asm("r3"); |
107 | __asm__ __volatile__( | 107 | asm volatile( |
108 | "ldm%?ia %1!, {%2, %3}\n\t" | 108 | "ldm%?ia %0!, {%1, %2}" |
109 | : "+r" (buf), "=&r" (tmp), "=&r" (tmp2)); | ||
110 | length -= 8; | ||
111 | asm volatile( | ||
112 | "str%?h %1, [%0], #4\n\t" | ||
113 | "mov%? %1, %1, lsr #16\n\t" | ||
114 | "str%?h %1, [%0], #4\n\t" | ||
109 | "str%?h %2, [%0], #4\n\t" | 115 | "str%?h %2, [%0], #4\n\t" |
110 | "mov%? %2, %2, lsr #16\n\t" | 116 | "mov%? %2, %2, lsr #16\n\t" |
111 | "str%?h %2, [%0], #4\n\t" | 117 | "str%?h %2, [%0], #4" |
112 | "str%?h %3, [%0], #4\n\t" | 118 | : "+r" (offset), "=&r" (tmp), "=&r" (tmp2)); |
113 | "mov%? %3, %3, lsr #16\n\t" | ||
114 | "str%?h %3, [%0], #4" | ||
115 | : "=&r" (offset), "=&r" (buf), "=r" (tmp), "=r" (tmp2) | ||
116 | : "0" (offset), "1" (buf)); | ||
117 | length -= 8; | ||
118 | } | 119 | } |
119 | while (length > 0) { | 120 | while (length > 0) { |
120 | __asm__ __volatile__("str%?h %2, [%0], #4" | 121 | asm volatile("str%?h %2, [%0], #4" |
121 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); | 122 | : "=&r" (offset) : "0" (offset), "r" (buf[0] | (buf[1] << 8))); |
122 | buf += 2; | 123 | buf += 2; |
123 | length -= 2; | 124 | length -= 2; |
124 | } | 125 | } |
125 | } | 126 | } |
126 | 127 | ||
127 | static inline void | 128 | static void |
128 | am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) | 129 | am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned int length) |
129 | { | 130 | { |
130 | offset = ISAMEM_BASE + (offset << 1); | 131 | offset = ISAMEM_BASE + (offset << 1); |
131 | length = (length + 1) & ~1; | 132 | length = (length + 1) & ~1; |
132 | if ((int)buf & 2) { | 133 | if ((int)buf & 2) { |
133 | unsigned int tmp; | 134 | unsigned int tmp; |
134 | __asm__ __volatile__( | 135 | asm volatile( |
135 | "ldr%?h %2, [%0], #4\n\t" | 136 | "ldr%?h %2, [%0], #4\n\t" |
136 | "str%?b %2, [%1], #1\n\t" | 137 | "str%?b %2, [%1], #1\n\t" |
137 | "mov%? %2, %2, lsr #8\n\t" | 138 | "mov%? %2, %2, lsr #8\n\t" |
@@ -140,12 +141,12 @@ am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned | |||
140 | length -= 2; | 141 | length -= 2; |
141 | } | 142 | } |
142 | while (length > 8) { | 143 | while (length > 8) { |
143 | unsigned int tmp, tmp2, tmp3; | 144 | register unsigned int tmp asm("r2"), tmp2 asm("r3"), tmp3; |
144 | __asm__ __volatile__( | 145 | asm volatile( |
145 | "ldr%?h %2, [%0], #4\n\t" | 146 | "ldr%?h %2, [%0], #4\n\t" |
147 | "ldr%?h %4, [%0], #4\n\t" | ||
146 | "ldr%?h %3, [%0], #4\n\t" | 148 | "ldr%?h %3, [%0], #4\n\t" |
147 | "orr%? %2, %2, %3, lsl #16\n\t" | 149 | "orr%? %2, %2, %4, lsl #16\n\t" |
148 | "ldr%?h %3, [%0], #4\n\t" | ||
149 | "ldr%?h %4, [%0], #4\n\t" | 150 | "ldr%?h %4, [%0], #4\n\t" |
150 | "orr%? %3, %3, %4, lsl #16\n\t" | 151 | "orr%? %3, %3, %4, lsl #16\n\t" |
151 | "stm%?ia %1!, {%2, %3}" | 152 | "stm%?ia %1!, {%2, %3}" |
@@ -155,7 +156,7 @@ am_readbuffer(struct net_device *dev, u_int offset, unsigned char *buf, unsigned | |||
155 | } | 156 | } |
156 | while (length > 0) { | 157 | while (length > 0) { |
157 | unsigned int tmp; | 158 | unsigned int tmp; |
158 | __asm__ __volatile__( | 159 | asm volatile( |
159 | "ldr%?h %2, [%0], #4\n\t" | 160 | "ldr%?h %2, [%0], #4\n\t" |
160 | "str%?b %2, [%1], #1\n\t" | 161 | "str%?b %2, [%1], #1\n\t" |
161 | "mov%? %2, %2, lsr #8\n\t" | 162 | "mov%? %2, %2, lsr #8\n\t" |
@@ -196,6 +197,42 @@ am79c961_ramtest(struct net_device *dev, unsigned int val) | |||
196 | return errorcount; | 197 | return errorcount; |
197 | } | 198 | } |
198 | 199 | ||
200 | static void am79c961_mc_hash(char *addr, u16 *hash) | ||
201 | { | ||
202 | if (addr[0] & 0x01) { | ||
203 | int idx, bit; | ||
204 | u32 crc; | ||
205 | |||
206 | crc = ether_crc_le(ETH_ALEN, addr); | ||
207 | |||
208 | idx = crc >> 30; | ||
209 | bit = (crc >> 26) & 15; | ||
210 | |||
211 | hash[idx] |= 1 << bit; | ||
212 | } | ||
213 | } | ||
214 | |||
215 | static unsigned int am79c961_get_rx_mode(struct net_device *dev, u16 *hash) | ||
216 | { | ||
217 | unsigned int mode = MODE_PORT_10BT; | ||
218 | |||
219 | if (dev->flags & IFF_PROMISC) { | ||
220 | mode |= MODE_PROMISC; | ||
221 | memset(hash, 0xff, 4 * sizeof(*hash)); | ||
222 | } else if (dev->flags & IFF_ALLMULTI) { | ||
223 | memset(hash, 0xff, 4 * sizeof(*hash)); | ||
224 | } else { | ||
225 | struct netdev_hw_addr *ha; | ||
226 | |||
227 | memset(hash, 0, 4 * sizeof(*hash)); | ||
228 | |||
229 | netdev_for_each_mc_addr(ha, dev) | ||
230 | am79c961_mc_hash(ha->addr, hash); | ||
231 | } | ||
232 | |||
233 | return mode; | ||
234 | } | ||
235 | |||
199 | static void | 236 | static void |
200 | am79c961_init_for_open(struct net_device *dev) | 237 | am79c961_init_for_open(struct net_device *dev) |
201 | { | 238 | { |
@@ -203,6 +240,7 @@ am79c961_init_for_open(struct net_device *dev) | |||
203 | unsigned long flags; | 240 | unsigned long flags; |
204 | unsigned char *p; | 241 | unsigned char *p; |
205 | u_int hdr_addr, first_free_addr; | 242 | u_int hdr_addr, first_free_addr; |
243 | u16 multi_hash[4], mode = am79c961_get_rx_mode(dev, multi_hash); | ||
206 | int i; | 244 | int i; |
207 | 245 | ||
208 | /* | 246 | /* |
@@ -218,16 +256,12 @@ am79c961_init_for_open(struct net_device *dev) | |||
218 | write_ireg (dev->base_addr, 2, 0x0000); /* MODE register selects media */ | 256 | write_ireg (dev->base_addr, 2, 0x0000); /* MODE register selects media */ |
219 | 257 | ||
220 | for (i = LADRL; i <= LADRH; i++) | 258 | for (i = LADRL; i <= LADRH; i++) |
221 | write_rreg (dev->base_addr, i, 0); | 259 | write_rreg (dev->base_addr, i, multi_hash[i - LADRL]); |
222 | 260 | ||
223 | for (i = PADRL, p = dev->dev_addr; i <= PADRH; i++, p += 2) | 261 | for (i = PADRL, p = dev->dev_addr; i <= PADRH; i++, p += 2) |
224 | write_rreg (dev->base_addr, i, p[0] | (p[1] << 8)); | 262 | write_rreg (dev->base_addr, i, p[0] | (p[1] << 8)); |
225 | 263 | ||
226 | i = MODE_PORT_10BT; | 264 | write_rreg (dev->base_addr, MODE, mode); |
227 | if (dev->flags & IFF_PROMISC) | ||
228 | i |= MODE_PROMISC; | ||
229 | |||
230 | write_rreg (dev->base_addr, MODE, i); | ||
231 | write_rreg (dev->base_addr, POLLINT, 0); | 265 | write_rreg (dev->base_addr, POLLINT, 0); |
232 | write_rreg (dev->base_addr, SIZERXR, -RX_BUFFERS); | 266 | write_rreg (dev->base_addr, SIZERXR, -RX_BUFFERS); |
233 | write_rreg (dev->base_addr, SIZETXR, -TX_BUFFERS); | 267 | write_rreg (dev->base_addr, SIZETXR, -TX_BUFFERS); |
@@ -340,21 +374,6 @@ am79c961_close(struct net_device *dev) | |||
340 | return 0; | 374 | return 0; |
341 | } | 375 | } |
342 | 376 | ||
343 | static void am79c961_mc_hash(char *addr, unsigned short *hash) | ||
344 | { | ||
345 | if (addr[0] & 0x01) { | ||
346 | int idx, bit; | ||
347 | u32 crc; | ||
348 | |||
349 | crc = ether_crc_le(ETH_ALEN, addr); | ||
350 | |||
351 | idx = crc >> 30; | ||
352 | bit = (crc >> 26) & 15; | ||
353 | |||
354 | hash[idx] |= 1 << bit; | ||
355 | } | ||
356 | } | ||
357 | |||
358 | /* | 377 | /* |
359 | * Set or clear promiscuous/multicast mode filter for this adapter. | 378 | * Set or clear promiscuous/multicast mode filter for this adapter. |
360 | */ | 379 | */ |
@@ -362,24 +381,9 @@ static void am79c961_setmulticastlist (struct net_device *dev) | |||
362 | { | 381 | { |
363 | struct dev_priv *priv = netdev_priv(dev); | 382 | struct dev_priv *priv = netdev_priv(dev); |
364 | unsigned long flags; | 383 | unsigned long flags; |
365 | unsigned short multi_hash[4], mode; | 384 | u16 multi_hash[4], mode = am79c961_get_rx_mode(dev, multi_hash); |
366 | int i, stopped; | 385 | int i, stopped; |
367 | 386 | ||
368 | mode = MODE_PORT_10BT; | ||
369 | |||
370 | if (dev->flags & IFF_PROMISC) { | ||
371 | mode |= MODE_PROMISC; | ||
372 | } else if (dev->flags & IFF_ALLMULTI) { | ||
373 | memset(multi_hash, 0xff, sizeof(multi_hash)); | ||
374 | } else { | ||
375 | struct netdev_hw_addr *ha; | ||
376 | |||
377 | memset(multi_hash, 0x00, sizeof(multi_hash)); | ||
378 | |||
379 | netdev_for_each_mc_addr(ha, dev) | ||
380 | am79c961_mc_hash(ha->addr, multi_hash); | ||
381 | } | ||
382 | |||
383 | spin_lock_irqsave(&priv->chip_lock, flags); | 387 | spin_lock_irqsave(&priv->chip_lock, flags); |
384 | 388 | ||
385 | stopped = read_rreg(dev->base_addr, CSR0) & CSR0_STOP; | 389 | stopped = read_rreg(dev->base_addr, CSR0) & CSR0_STOP; |
diff --git a/drivers/net/arm/ep93xx_eth.c b/drivers/net/arm/ep93xx_eth.c index 5a77001b6d1..0b46b8ea0e8 100644 --- a/drivers/net/arm/ep93xx_eth.c +++ b/drivers/net/arm/ep93xx_eth.c | |||
@@ -283,10 +283,14 @@ static int ep93xx_rx(struct net_device *dev, int processed, int budget) | |||
283 | 283 | ||
284 | skb = dev_alloc_skb(length + 2); | 284 | skb = dev_alloc_skb(length + 2); |
285 | if (likely(skb != NULL)) { | 285 | if (likely(skb != NULL)) { |
286 | struct ep93xx_rdesc *rxd = &ep->descs->rdesc[entry]; | ||
286 | skb_reserve(skb, 2); | 287 | skb_reserve(skb, 2); |
287 | dma_sync_single_for_cpu(NULL, ep->descs->rdesc[entry].buf_addr, | 288 | dma_sync_single_for_cpu(dev->dev.parent, rxd->buf_addr, |
288 | length, DMA_FROM_DEVICE); | 289 | length, DMA_FROM_DEVICE); |
289 | skb_copy_to_linear_data(skb, ep->rx_buf[entry], length); | 290 | skb_copy_to_linear_data(skb, ep->rx_buf[entry], length); |
291 | dma_sync_single_for_device(dev->dev.parent, | ||
292 | rxd->buf_addr, length, | ||
293 | DMA_FROM_DEVICE); | ||
290 | skb_put(skb, length); | 294 | skb_put(skb, length); |
291 | skb->protocol = eth_type_trans(skb, dev); | 295 | skb->protocol = eth_type_trans(skb, dev); |
292 | 296 | ||
@@ -348,6 +352,7 @@ poll_some_more: | |||
348 | static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | 352 | static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) |
349 | { | 353 | { |
350 | struct ep93xx_priv *ep = netdev_priv(dev); | 354 | struct ep93xx_priv *ep = netdev_priv(dev); |
355 | struct ep93xx_tdesc *txd; | ||
351 | int entry; | 356 | int entry; |
352 | 357 | ||
353 | if (unlikely(skb->len > MAX_PKT_SIZE)) { | 358 | if (unlikely(skb->len > MAX_PKT_SIZE)) { |
@@ -359,11 +364,14 @@ static int ep93xx_xmit(struct sk_buff *skb, struct net_device *dev) | |||
359 | entry = ep->tx_pointer; | 364 | entry = ep->tx_pointer; |
360 | ep->tx_pointer = (ep->tx_pointer + 1) & (TX_QUEUE_ENTRIES - 1); | 365 | ep->tx_pointer = (ep->tx_pointer + 1) & (TX_QUEUE_ENTRIES - 1); |
361 | 366 | ||
362 | ep->descs->tdesc[entry].tdesc1 = | 367 | txd = &ep->descs->tdesc[entry]; |
363 | TDESC1_EOF | (entry << 16) | (skb->len & 0xfff); | 368 | |
369 | txd->tdesc1 = TDESC1_EOF | (entry << 16) | (skb->len & 0xfff); | ||
370 | dma_sync_single_for_cpu(dev->dev.parent, txd->buf_addr, skb->len, | ||
371 | DMA_TO_DEVICE); | ||
364 | skb_copy_and_csum_dev(skb, ep->tx_buf[entry]); | 372 | skb_copy_and_csum_dev(skb, ep->tx_buf[entry]); |
365 | dma_sync_single_for_cpu(NULL, ep->descs->tdesc[entry].buf_addr, | 373 | dma_sync_single_for_device(dev->dev.parent, txd->buf_addr, skb->len, |
366 | skb->len, DMA_TO_DEVICE); | 374 | DMA_TO_DEVICE); |
367 | dev_kfree_skb(skb); | 375 | dev_kfree_skb(skb); |
368 | 376 | ||
369 | spin_lock_irq(&ep->tx_pending_lock); | 377 | spin_lock_irq(&ep->tx_pending_lock); |
@@ -457,89 +465,80 @@ static irqreturn_t ep93xx_irq(int irq, void *dev_id) | |||
457 | 465 | ||
458 | static void ep93xx_free_buffers(struct ep93xx_priv *ep) | 466 | static void ep93xx_free_buffers(struct ep93xx_priv *ep) |
459 | { | 467 | { |
468 | struct device *dev = ep->dev->dev.parent; | ||
460 | int i; | 469 | int i; |
461 | 470 | ||
462 | for (i = 0; i < RX_QUEUE_ENTRIES; i += 2) { | 471 | for (i = 0; i < RX_QUEUE_ENTRIES; i++) { |
463 | dma_addr_t d; | 472 | dma_addr_t d; |
464 | 473 | ||
465 | d = ep->descs->rdesc[i].buf_addr; | 474 | d = ep->descs->rdesc[i].buf_addr; |
466 | if (d) | 475 | if (d) |
467 | dma_unmap_single(NULL, d, PAGE_SIZE, DMA_FROM_DEVICE); | 476 | dma_unmap_single(dev, d, PKT_BUF_SIZE, DMA_FROM_DEVICE); |
468 | 477 | ||
469 | if (ep->rx_buf[i] != NULL) | 478 | if (ep->rx_buf[i] != NULL) |
470 | free_page((unsigned long)ep->rx_buf[i]); | 479 | kfree(ep->rx_buf[i]); |
471 | } | 480 | } |
472 | 481 | ||
473 | for (i = 0; i < TX_QUEUE_ENTRIES; i += 2) { | 482 | for (i = 0; i < TX_QUEUE_ENTRIES; i++) { |
474 | dma_addr_t d; | 483 | dma_addr_t d; |
475 | 484 | ||
476 | d = ep->descs->tdesc[i].buf_addr; | 485 | d = ep->descs->tdesc[i].buf_addr; |
477 | if (d) | 486 | if (d) |
478 | dma_unmap_single(NULL, d, PAGE_SIZE, DMA_TO_DEVICE); | 487 | dma_unmap_single(dev, d, PKT_BUF_SIZE, DMA_TO_DEVICE); |
479 | 488 | ||
480 | if (ep->tx_buf[i] != NULL) | 489 | if (ep->tx_buf[i] != NULL) |
481 | free_page((unsigned long)ep->tx_buf[i]); | 490 | kfree(ep->tx_buf[i]); |
482 | } | 491 | } |
483 | 492 | ||
484 | dma_free_coherent(NULL, sizeof(struct ep93xx_descs), ep->descs, | 493 | dma_free_coherent(dev, sizeof(struct ep93xx_descs), ep->descs, |
485 | ep->descs_dma_addr); | 494 | ep->descs_dma_addr); |
486 | } | 495 | } |
487 | 496 | ||
488 | /* | ||
489 | * The hardware enforces a sub-2K maximum packet size, so we put | ||
490 | * two buffers on every hardware page. | ||
491 | */ | ||
492 | static int ep93xx_alloc_buffers(struct ep93xx_priv *ep) | 497 | static int ep93xx_alloc_buffers(struct ep93xx_priv *ep) |
493 | { | 498 | { |
499 | struct device *dev = ep->dev->dev.parent; | ||
494 | int i; | 500 | int i; |
495 | 501 | ||
496 | ep->descs = dma_alloc_coherent(NULL, sizeof(struct ep93xx_descs), | 502 | ep->descs = dma_alloc_coherent(dev, sizeof(struct ep93xx_descs), |
497 | &ep->descs_dma_addr, GFP_KERNEL | GFP_DMA); | 503 | &ep->descs_dma_addr, GFP_KERNEL); |
498 | if (ep->descs == NULL) | 504 | if (ep->descs == NULL) |
499 | return 1; | 505 | return 1; |
500 | 506 | ||
501 | for (i = 0; i < RX_QUEUE_ENTRIES; i += 2) { | 507 | for (i = 0; i < RX_QUEUE_ENTRIES; i++) { |
502 | void *page; | 508 | void *buf; |
503 | dma_addr_t d; | 509 | dma_addr_t d; |
504 | 510 | ||
505 | page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA); | 511 | buf = kmalloc(PKT_BUF_SIZE, GFP_KERNEL); |
506 | if (page == NULL) | 512 | if (buf == NULL) |
507 | goto err; | 513 | goto err; |
508 | 514 | ||
509 | d = dma_map_single(NULL, page, PAGE_SIZE, DMA_FROM_DEVICE); | 515 | d = dma_map_single(dev, buf, PKT_BUF_SIZE, DMA_FROM_DEVICE); |
510 | if (dma_mapping_error(NULL, d)) { | 516 | if (dma_mapping_error(dev, d)) { |
511 | free_page((unsigned long)page); | 517 | kfree(buf); |
512 | goto err; | 518 | goto err; |
513 | } | 519 | } |
514 | 520 | ||
515 | ep->rx_buf[i] = page; | 521 | ep->rx_buf[i] = buf; |
516 | ep->descs->rdesc[i].buf_addr = d; | 522 | ep->descs->rdesc[i].buf_addr = d; |
517 | ep->descs->rdesc[i].rdesc1 = (i << 16) | PKT_BUF_SIZE; | 523 | ep->descs->rdesc[i].rdesc1 = (i << 16) | PKT_BUF_SIZE; |
518 | |||
519 | ep->rx_buf[i + 1] = page + PKT_BUF_SIZE; | ||
520 | ep->descs->rdesc[i + 1].buf_addr = d + PKT_BUF_SIZE; | ||
521 | ep->descs->rdesc[i + 1].rdesc1 = ((i + 1) << 16) | PKT_BUF_SIZE; | ||
522 | } | 524 | } |
523 | 525 | ||
524 | for (i = 0; i < TX_QUEUE_ENTRIES; i += 2) { | 526 | for (i = 0; i < TX_QUEUE_ENTRIES; i++) { |
525 | void *page; | 527 | void *buf; |
526 | dma_addr_t d; | 528 | dma_addr_t d; |
527 | 529 | ||
528 | page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA); | 530 | buf = kmalloc(PKT_BUF_SIZE, GFP_KERNEL); |
529 | if (page == NULL) | 531 | if (buf == NULL) |
530 | goto err; | 532 | goto err; |
531 | 533 | ||
532 | d = dma_map_single(NULL, page, PAGE_SIZE, DMA_TO_DEVICE); | 534 | d = dma_map_single(dev, buf, PKT_BUF_SIZE, DMA_TO_DEVICE); |
533 | if (dma_mapping_error(NULL, d)) { | 535 | if (dma_mapping_error(dev, d)) { |
534 | free_page((unsigned long)page); | 536 | kfree(buf); |
535 | goto err; | 537 | goto err; |
536 | } | 538 | } |
537 | 539 | ||
538 | ep->tx_buf[i] = page; | 540 | ep->tx_buf[i] = buf; |
539 | ep->descs->tdesc[i].buf_addr = d; | 541 | ep->descs->tdesc[i].buf_addr = d; |
540 | |||
541 | ep->tx_buf[i + 1] = page + PKT_BUF_SIZE; | ||
542 | ep->descs->tdesc[i + 1].buf_addr = d + PKT_BUF_SIZE; | ||
543 | } | 542 | } |
544 | 543 | ||
545 | return 0; | 544 | return 0; |
@@ -829,6 +828,7 @@ static int ep93xx_eth_probe(struct platform_device *pdev) | |||
829 | } | 828 | } |
830 | ep = netdev_priv(dev); | 829 | ep = netdev_priv(dev); |
831 | ep->dev = dev; | 830 | ep->dev = dev; |
831 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
832 | netif_napi_add(dev, &ep->napi, ep93xx_poll, 64); | 832 | netif_napi_add(dev, &ep->napi, ep93xx_poll, 64); |
833 | 833 | ||
834 | platform_set_drvdata(pdev, dev); | 834 | platform_set_drvdata(pdev, dev); |
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index 9eb9b98a7ae..de51e8453c1 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c | |||
@@ -30,9 +30,12 @@ | |||
30 | #include <linux/etherdevice.h> | 30 | #include <linux/etherdevice.h> |
31 | #include <linux/io.h> | 31 | #include <linux/io.h> |
32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
33 | #include <linux/net_tstamp.h> | ||
33 | #include <linux/phy.h> | 34 | #include <linux/phy.h> |
34 | #include <linux/platform_device.h> | 35 | #include <linux/platform_device.h> |
36 | #include <linux/ptp_classify.h> | ||
35 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
38 | #include <mach/ixp46x_ts.h> | ||
36 | #include <mach/npe.h> | 39 | #include <mach/npe.h> |
37 | #include <mach/qmgr.h> | 40 | #include <mach/qmgr.h> |
38 | 41 | ||
@@ -67,6 +70,10 @@ | |||
67 | #define RXFREE_QUEUE(port_id) (NPE_ID(port_id) + 26) | 70 | #define RXFREE_QUEUE(port_id) (NPE_ID(port_id) + 26) |
68 | #define TXDONE_QUEUE 31 | 71 | #define TXDONE_QUEUE 31 |
69 | 72 | ||
73 | #define PTP_SLAVE_MODE 1 | ||
74 | #define PTP_MASTER_MODE 2 | ||
75 | #define PORT2CHANNEL(p) NPE_ID(p->id) | ||
76 | |||
70 | /* TX Control Registers */ | 77 | /* TX Control Registers */ |
71 | #define TX_CNTRL0_TX_EN 0x01 | 78 | #define TX_CNTRL0_TX_EN 0x01 |
72 | #define TX_CNTRL0_HALFDUPLEX 0x02 | 79 | #define TX_CNTRL0_HALFDUPLEX 0x02 |
@@ -171,6 +178,8 @@ struct port { | |||
171 | int id; /* logical port ID */ | 178 | int id; /* logical port ID */ |
172 | int speed, duplex; | 179 | int speed, duplex; |
173 | u8 firmware[4]; | 180 | u8 firmware[4]; |
181 | int hwts_tx_en; | ||
182 | int hwts_rx_en; | ||
174 | }; | 183 | }; |
175 | 184 | ||
176 | /* NPE message structure */ | 185 | /* NPE message structure */ |
@@ -246,6 +255,172 @@ static int ports_open; | |||
246 | static struct port *npe_port_tab[MAX_NPES]; | 255 | static struct port *npe_port_tab[MAX_NPES]; |
247 | static struct dma_pool *dma_pool; | 256 | static struct dma_pool *dma_pool; |
248 | 257 | ||
258 | static struct sock_filter ptp_filter[] = { | ||
259 | PTP_FILTER | ||
260 | }; | ||
261 | |||
262 | static int ixp_ptp_match(struct sk_buff *skb, u16 uid_hi, u32 uid_lo, u16 seqid) | ||
263 | { | ||
264 | u8 *data = skb->data; | ||
265 | unsigned int offset; | ||
266 | u16 *hi, *id; | ||
267 | u32 lo; | ||
268 | |||
269 | if (sk_run_filter(skb, ptp_filter) != PTP_CLASS_V1_IPV4) | ||
270 | return 0; | ||
271 | |||
272 | offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN; | ||
273 | |||
274 | if (skb->len < offset + OFF_PTP_SEQUENCE_ID + sizeof(seqid)) | ||
275 | return 0; | ||
276 | |||
277 | hi = (u16 *)(data + offset + OFF_PTP_SOURCE_UUID); | ||
278 | id = (u16 *)(data + offset + OFF_PTP_SEQUENCE_ID); | ||
279 | |||
280 | memcpy(&lo, &hi[1], sizeof(lo)); | ||
281 | |||
282 | return (uid_hi == ntohs(*hi) && | ||
283 | uid_lo == ntohl(lo) && | ||
284 | seqid == ntohs(*id)); | ||
285 | } | ||
286 | |||
287 | static void ixp_rx_timestamp(struct port *port, struct sk_buff *skb) | ||
288 | { | ||
289 | struct skb_shared_hwtstamps *shhwtstamps; | ||
290 | struct ixp46x_ts_regs *regs; | ||
291 | u64 ns; | ||
292 | u32 ch, hi, lo, val; | ||
293 | u16 uid, seq; | ||
294 | |||
295 | if (!port->hwts_rx_en) | ||
296 | return; | ||
297 | |||
298 | ch = PORT2CHANNEL(port); | ||
299 | |||
300 | regs = (struct ixp46x_ts_regs __iomem *) IXP4XX_TIMESYNC_BASE_VIRT; | ||
301 | |||
302 | val = __raw_readl(®s->channel[ch].ch_event); | ||
303 | |||
304 | if (!(val & RX_SNAPSHOT_LOCKED)) | ||
305 | return; | ||
306 | |||
307 | lo = __raw_readl(®s->channel[ch].src_uuid_lo); | ||
308 | hi = __raw_readl(®s->channel[ch].src_uuid_hi); | ||
309 | |||
310 | uid = hi & 0xffff; | ||
311 | seq = (hi >> 16) & 0xffff; | ||
312 | |||
313 | if (!ixp_ptp_match(skb, htons(uid), htonl(lo), htons(seq))) | ||
314 | goto out; | ||
315 | |||
316 | lo = __raw_readl(®s->channel[ch].rx_snap_lo); | ||
317 | hi = __raw_readl(®s->channel[ch].rx_snap_hi); | ||
318 | ns = ((u64) hi) << 32; | ||
319 | ns |= lo; | ||
320 | ns <<= TICKS_NS_SHIFT; | ||
321 | |||
322 | shhwtstamps = skb_hwtstamps(skb); | ||
323 | memset(shhwtstamps, 0, sizeof(*shhwtstamps)); | ||
324 | shhwtstamps->hwtstamp = ns_to_ktime(ns); | ||
325 | out: | ||
326 | __raw_writel(RX_SNAPSHOT_LOCKED, ®s->channel[ch].ch_event); | ||
327 | } | ||
328 | |||
329 | static void ixp_tx_timestamp(struct port *port, struct sk_buff *skb) | ||
330 | { | ||
331 | struct skb_shared_hwtstamps shhwtstamps; | ||
332 | struct ixp46x_ts_regs *regs; | ||
333 | struct skb_shared_info *shtx; | ||
334 | u64 ns; | ||
335 | u32 ch, cnt, hi, lo, val; | ||
336 | |||
337 | shtx = skb_shinfo(skb); | ||
338 | if (unlikely(shtx->tx_flags & SKBTX_HW_TSTAMP && port->hwts_tx_en)) | ||
339 | shtx->tx_flags |= SKBTX_IN_PROGRESS; | ||
340 | else | ||
341 | return; | ||
342 | |||
343 | ch = PORT2CHANNEL(port); | ||
344 | |||
345 | regs = (struct ixp46x_ts_regs __iomem *) IXP4XX_TIMESYNC_BASE_VIRT; | ||
346 | |||
347 | /* | ||
348 | * This really stinks, but we have to poll for the Tx time stamp. | ||
349 | * Usually, the time stamp is ready after 4 to 6 microseconds. | ||
350 | */ | ||
351 | for (cnt = 0; cnt < 100; cnt++) { | ||
352 | val = __raw_readl(®s->channel[ch].ch_event); | ||
353 | if (val & TX_SNAPSHOT_LOCKED) | ||
354 | break; | ||
355 | udelay(1); | ||
356 | } | ||
357 | if (!(val & TX_SNAPSHOT_LOCKED)) { | ||
358 | shtx->tx_flags &= ~SKBTX_IN_PROGRESS; | ||
359 | return; | ||
360 | } | ||
361 | |||
362 | lo = __raw_readl(®s->channel[ch].tx_snap_lo); | ||
363 | hi = __raw_readl(®s->channel[ch].tx_snap_hi); | ||
364 | ns = ((u64) hi) << 32; | ||
365 | ns |= lo; | ||
366 | ns <<= TICKS_NS_SHIFT; | ||
367 | |||
368 | memset(&shhwtstamps, 0, sizeof(shhwtstamps)); | ||
369 | shhwtstamps.hwtstamp = ns_to_ktime(ns); | ||
370 | skb_tstamp_tx(skb, &shhwtstamps); | ||
371 | |||
372 | __raw_writel(TX_SNAPSHOT_LOCKED, ®s->channel[ch].ch_event); | ||
373 | } | ||
374 | |||
375 | static int hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) | ||
376 | { | ||
377 | struct hwtstamp_config cfg; | ||
378 | struct ixp46x_ts_regs *regs; | ||
379 | struct port *port = netdev_priv(netdev); | ||
380 | int ch; | ||
381 | |||
382 | if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) | ||
383 | return -EFAULT; | ||
384 | |||
385 | if (cfg.flags) /* reserved for future extensions */ | ||
386 | return -EINVAL; | ||
387 | |||
388 | ch = PORT2CHANNEL(port); | ||
389 | regs = (struct ixp46x_ts_regs __iomem *) IXP4XX_TIMESYNC_BASE_VIRT; | ||
390 | |||
391 | switch (cfg.tx_type) { | ||
392 | case HWTSTAMP_TX_OFF: | ||
393 | port->hwts_tx_en = 0; | ||
394 | break; | ||
395 | case HWTSTAMP_TX_ON: | ||
396 | port->hwts_tx_en = 1; | ||
397 | break; | ||
398 | default: | ||
399 | return -ERANGE; | ||
400 | } | ||
401 | |||
402 | switch (cfg.rx_filter) { | ||
403 | case HWTSTAMP_FILTER_NONE: | ||
404 | port->hwts_rx_en = 0; | ||
405 | break; | ||
406 | case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: | ||
407 | port->hwts_rx_en = PTP_SLAVE_MODE; | ||
408 | __raw_writel(0, ®s->channel[ch].ch_control); | ||
409 | break; | ||
410 | case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: | ||
411 | port->hwts_rx_en = PTP_MASTER_MODE; | ||
412 | __raw_writel(MASTER_MODE, ®s->channel[ch].ch_control); | ||
413 | break; | ||
414 | default: | ||
415 | return -ERANGE; | ||
416 | } | ||
417 | |||
418 | /* Clear out any old time stamps. */ | ||
419 | __raw_writel(TX_SNAPSHOT_LOCKED | RX_SNAPSHOT_LOCKED, | ||
420 | ®s->channel[ch].ch_event); | ||
421 | |||
422 | return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; | ||
423 | } | ||
249 | 424 | ||
250 | static int ixp4xx_mdio_cmd(struct mii_bus *bus, int phy_id, int location, | 425 | static int ixp4xx_mdio_cmd(struct mii_bus *bus, int phy_id, int location, |
251 | int write, u16 cmd) | 426 | int write, u16 cmd) |
@@ -573,6 +748,7 @@ static int eth_poll(struct napi_struct *napi, int budget) | |||
573 | 748 | ||
574 | debug_pkt(dev, "eth_poll", skb->data, skb->len); | 749 | debug_pkt(dev, "eth_poll", skb->data, skb->len); |
575 | 750 | ||
751 | ixp_rx_timestamp(port, skb); | ||
576 | skb->protocol = eth_type_trans(skb, dev); | 752 | skb->protocol = eth_type_trans(skb, dev); |
577 | dev->stats.rx_packets++; | 753 | dev->stats.rx_packets++; |
578 | dev->stats.rx_bytes += skb->len; | 754 | dev->stats.rx_bytes += skb->len; |
@@ -679,14 +855,12 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev) | |||
679 | return NETDEV_TX_OK; | 855 | return NETDEV_TX_OK; |
680 | } | 856 | } |
681 | memcpy_swab32(mem, (u32 *)((int)skb->data & ~3), bytes / 4); | 857 | memcpy_swab32(mem, (u32 *)((int)skb->data & ~3), bytes / 4); |
682 | dev_kfree_skb(skb); | ||
683 | #endif | 858 | #endif |
684 | 859 | ||
685 | phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); | 860 | phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); |
686 | if (dma_mapping_error(&dev->dev, phys)) { | 861 | if (dma_mapping_error(&dev->dev, phys)) { |
687 | #ifdef __ARMEB__ | ||
688 | dev_kfree_skb(skb); | 862 | dev_kfree_skb(skb); |
689 | #else | 863 | #ifndef __ARMEB__ |
690 | kfree(mem); | 864 | kfree(mem); |
691 | #endif | 865 | #endif |
692 | dev->stats.tx_dropped++; | 866 | dev->stats.tx_dropped++; |
@@ -728,6 +902,13 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev) | |||
728 | #if DEBUG_TX | 902 | #if DEBUG_TX |
729 | printk(KERN_DEBUG "%s: eth_xmit end\n", dev->name); | 903 | printk(KERN_DEBUG "%s: eth_xmit end\n", dev->name); |
730 | #endif | 904 | #endif |
905 | |||
906 | ixp_tx_timestamp(port, skb); | ||
907 | skb_tx_timestamp(skb); | ||
908 | |||
909 | #ifndef __ARMEB__ | ||
910 | dev_kfree_skb(skb); | ||
911 | #endif | ||
731 | return NETDEV_TX_OK; | 912 | return NETDEV_TX_OK; |
732 | } | 913 | } |
733 | 914 | ||
@@ -783,6 +964,9 @@ static int eth_ioctl(struct net_device *dev, struct ifreq *req, int cmd) | |||
783 | if (!netif_running(dev)) | 964 | if (!netif_running(dev)) |
784 | return -EINVAL; | 965 | return -EINVAL; |
785 | 966 | ||
967 | if (cpu_is_ixp46x() && cmd == SIOCSHWTSTAMP) | ||
968 | return hwtstamp_ioctl(dev, req, cmd); | ||
969 | |||
786 | return phy_mii_ioctl(port->phydev, req, cmd); | 970 | return phy_mii_ioctl(port->phydev, req, cmd); |
787 | } | 971 | } |
788 | 972 | ||
@@ -1171,6 +1355,11 @@ static int __devinit eth_init_one(struct platform_device *pdev) | |||
1171 | char phy_id[MII_BUS_ID_SIZE + 3]; | 1355 | char phy_id[MII_BUS_ID_SIZE + 3]; |
1172 | int err; | 1356 | int err; |
1173 | 1357 | ||
1358 | if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) { | ||
1359 | pr_err("ixp4xx_eth: bad ptp filter\n"); | ||
1360 | return -EINVAL; | ||
1361 | } | ||
1362 | |||
1174 | if (!(dev = alloc_etherdev(sizeof(struct port)))) | 1363 | if (!(dev = alloc_etherdev(sizeof(struct port)))) |
1175 | return -ENOMEM; | 1364 | return -ENOMEM; |
1176 | 1365 | ||
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index 68d45ba2d9b..6c019e14854 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c | |||
@@ -52,13 +52,13 @@ MODULE_DESCRIPTION(DRV_DESC); | |||
52 | MODULE_ALIAS("platform:bfin_mac"); | 52 | MODULE_ALIAS("platform:bfin_mac"); |
53 | 53 | ||
54 | #if defined(CONFIG_BFIN_MAC_USE_L1) | 54 | #if defined(CONFIG_BFIN_MAC_USE_L1) |
55 | # define bfin_mac_alloc(dma_handle, size) l1_data_sram_zalloc(size) | 55 | # define bfin_mac_alloc(dma_handle, size, num) l1_data_sram_zalloc(size*num) |
56 | # define bfin_mac_free(dma_handle, ptr) l1_data_sram_free(ptr) | 56 | # define bfin_mac_free(dma_handle, ptr, num) l1_data_sram_free(ptr) |
57 | #else | 57 | #else |
58 | # define bfin_mac_alloc(dma_handle, size) \ | 58 | # define bfin_mac_alloc(dma_handle, size, num) \ |
59 | dma_alloc_coherent(NULL, size, dma_handle, GFP_KERNEL) | 59 | dma_alloc_coherent(NULL, size*num, dma_handle, GFP_KERNEL) |
60 | # define bfin_mac_free(dma_handle, ptr) \ | 60 | # define bfin_mac_free(dma_handle, ptr, num) \ |
61 | dma_free_coherent(NULL, sizeof(*ptr), ptr, dma_handle) | 61 | dma_free_coherent(NULL, sizeof(*ptr)*num, ptr, dma_handle) |
62 | #endif | 62 | #endif |
63 | 63 | ||
64 | #define PKT_BUF_SZ 1580 | 64 | #define PKT_BUF_SZ 1580 |
@@ -95,7 +95,7 @@ static void desc_list_free(void) | |||
95 | t = t->next; | 95 | t = t->next; |
96 | } | 96 | } |
97 | } | 97 | } |
98 | bfin_mac_free(dma_handle, tx_desc); | 98 | bfin_mac_free(dma_handle, tx_desc, CONFIG_BFIN_TX_DESC_NUM); |
99 | } | 99 | } |
100 | 100 | ||
101 | if (rx_desc) { | 101 | if (rx_desc) { |
@@ -109,7 +109,7 @@ static void desc_list_free(void) | |||
109 | r = r->next; | 109 | r = r->next; |
110 | } | 110 | } |
111 | } | 111 | } |
112 | bfin_mac_free(dma_handle, rx_desc); | 112 | bfin_mac_free(dma_handle, rx_desc, CONFIG_BFIN_RX_DESC_NUM); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
@@ -126,13 +126,13 @@ static int desc_list_init(void) | |||
126 | #endif | 126 | #endif |
127 | 127 | ||
128 | tx_desc = bfin_mac_alloc(&dma_handle, | 128 | tx_desc = bfin_mac_alloc(&dma_handle, |
129 | sizeof(struct net_dma_desc_tx) * | 129 | sizeof(struct net_dma_desc_tx), |
130 | CONFIG_BFIN_TX_DESC_NUM); | 130 | CONFIG_BFIN_TX_DESC_NUM); |
131 | if (tx_desc == NULL) | 131 | if (tx_desc == NULL) |
132 | goto init_error; | 132 | goto init_error; |
133 | 133 | ||
134 | rx_desc = bfin_mac_alloc(&dma_handle, | 134 | rx_desc = bfin_mac_alloc(&dma_handle, |
135 | sizeof(struct net_dma_desc_rx) * | 135 | sizeof(struct net_dma_desc_rx), |
136 | CONFIG_BFIN_RX_DESC_NUM); | 136 | CONFIG_BFIN_RX_DESC_NUM); |
137 | if (rx_desc == NULL) | 137 | if (rx_desc == NULL) |
138 | goto init_error; | 138 | goto init_error; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 17b4dd94da9..652b30e525d 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -388,6 +388,8 @@ struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr) | |||
388 | return next; | 388 | return next; |
389 | } | 389 | } |
390 | 390 | ||
391 | #define bond_queue_mapping(skb) (*(u16 *)((skb)->cb)) | ||
392 | |||
391 | /** | 393 | /** |
392 | * bond_dev_queue_xmit - Prepare skb for xmit. | 394 | * bond_dev_queue_xmit - Prepare skb for xmit. |
393 | * | 395 | * |
@@ -400,6 +402,9 @@ int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, | |||
400 | { | 402 | { |
401 | skb->dev = slave_dev; | 403 | skb->dev = slave_dev; |
402 | skb->priority = 1; | 404 | skb->priority = 1; |
405 | |||
406 | skb->queue_mapping = bond_queue_mapping(skb); | ||
407 | |||
403 | if (unlikely(netpoll_tx_running(slave_dev))) | 408 | if (unlikely(netpoll_tx_running(slave_dev))) |
404 | bond_netpoll_send_skb(bond_get_slave_by_dev(bond, slave_dev), skb); | 409 | bond_netpoll_send_skb(bond_get_slave_by_dev(bond, slave_dev), skb); |
405 | else | 410 | else |
@@ -4206,6 +4211,7 @@ static inline int bond_slave_override(struct bonding *bond, | |||
4206 | return res; | 4211 | return res; |
4207 | } | 4212 | } |
4208 | 4213 | ||
4214 | |||
4209 | static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb) | 4215 | static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb) |
4210 | { | 4216 | { |
4211 | /* | 4217 | /* |
@@ -4216,6 +4222,11 @@ static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb) | |||
4216 | */ | 4222 | */ |
4217 | u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0; | 4223 | u16 txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : 0; |
4218 | 4224 | ||
4225 | /* | ||
4226 | * Save the original txq to restore before passing to the driver | ||
4227 | */ | ||
4228 | bond_queue_mapping(skb) = skb->queue_mapping; | ||
4229 | |||
4219 | if (unlikely(txq >= dev->real_num_tx_queues)) { | 4230 | if (unlikely(txq >= dev->real_num_tx_queues)) { |
4220 | do { | 4231 | do { |
4221 | txq -= dev->real_num_tx_queues; | 4232 | txq -= dev->real_num_tx_queues; |
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index d4990568bae..17678117ed6 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
@@ -923,7 +923,7 @@ static int __devinit flexcan_probe(struct platform_device *pdev) | |||
923 | mem_size = resource_size(mem); | 923 | mem_size = resource_size(mem); |
924 | if (!request_mem_region(mem->start, mem_size, pdev->name)) { | 924 | if (!request_mem_region(mem->start, mem_size, pdev->name)) { |
925 | err = -EBUSY; | 925 | err = -EBUSY; |
926 | goto failed_req; | 926 | goto failed_get; |
927 | } | 927 | } |
928 | 928 | ||
929 | base = ioremap(mem->start, mem_size); | 929 | base = ioremap(mem->start, mem_size); |
@@ -977,9 +977,8 @@ static int __devinit flexcan_probe(struct platform_device *pdev) | |||
977 | iounmap(base); | 977 | iounmap(base); |
978 | failed_map: | 978 | failed_map: |
979 | release_mem_region(mem->start, mem_size); | 979 | release_mem_region(mem->start, mem_size); |
980 | failed_req: | ||
981 | clk_put(clk); | ||
982 | failed_get: | 980 | failed_get: |
981 | clk_put(clk); | ||
983 | failed_clock: | 982 | failed_clock: |
984 | return err; | 983 | return err; |
985 | } | 984 | } |
diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c index 587fba48cdd..f1942cab35f 100644 --- a/drivers/net/can/janz-ican3.c +++ b/drivers/net/can/janz-ican3.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/mfd/core.h> | ||
19 | 18 | ||
20 | #include <linux/netdevice.h> | 19 | #include <linux/netdevice.h> |
21 | #include <linux/can.h> | 20 | #include <linux/can.h> |
@@ -1644,7 +1643,7 @@ static int __devinit ican3_probe(struct platform_device *pdev) | |||
1644 | struct device *dev; | 1643 | struct device *dev; |
1645 | int ret; | 1644 | int ret; |
1646 | 1645 | ||
1647 | pdata = mfd_get_data(pdev); | 1646 | pdata = pdev->dev.platform_data; |
1648 | if (!pdata) | 1647 | if (!pdata) |
1649 | return -ENXIO; | 1648 | return -ENXIO; |
1650 | 1649 | ||
diff --git a/drivers/net/can/softing/softing_cs.c b/drivers/net/can/softing/softing_cs.c index c11bb4de863..c0e1b1eb87a 100644 --- a/drivers/net/can/softing/softing_cs.c +++ b/drivers/net/can/softing/softing_cs.c | |||
@@ -315,7 +315,7 @@ pcmcia_failed: | |||
315 | return ret ?: -ENODEV; | 315 | return ret ?: -ENODEV; |
316 | } | 316 | } |
317 | 317 | ||
318 | static /*const*/ struct pcmcia_device_id softingcs_ids[] = { | 318 | static const struct pcmcia_device_id softingcs_ids[] = { |
319 | /* softing */ | 319 | /* softing */ |
320 | PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0001), | 320 | PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0001), |
321 | PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0002), | 321 | PCMCIA_DEVICE_MANF_CARD(0x0168, 0x0002), |
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 29a4f06fbfc..dcc4a170b0f 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c | |||
@@ -1781,8 +1781,8 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev) | |||
1781 | ndev = alloc_etherdev(sizeof(struct emac_priv)); | 1781 | ndev = alloc_etherdev(sizeof(struct emac_priv)); |
1782 | if (!ndev) { | 1782 | if (!ndev) { |
1783 | dev_err(&pdev->dev, "error allocating net_device\n"); | 1783 | dev_err(&pdev->dev, "error allocating net_device\n"); |
1784 | clk_put(emac_clk); | 1784 | rc = -ENOMEM; |
1785 | return -ENOMEM; | 1785 | goto free_clk; |
1786 | } | 1786 | } |
1787 | 1787 | ||
1788 | platform_set_drvdata(pdev, ndev); | 1788 | platform_set_drvdata(pdev, ndev); |
@@ -1796,7 +1796,8 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev) | |||
1796 | pdata = pdev->dev.platform_data; | 1796 | pdata = pdev->dev.platform_data; |
1797 | if (!pdata) { | 1797 | if (!pdata) { |
1798 | dev_err(&pdev->dev, "no platform data\n"); | 1798 | dev_err(&pdev->dev, "no platform data\n"); |
1799 | return -ENODEV; | 1799 | rc = -ENODEV; |
1800 | goto probe_quit; | ||
1800 | } | 1801 | } |
1801 | 1802 | ||
1802 | /* MAC addr and PHY mask , RMII enable info from platform_data */ | 1803 | /* MAC addr and PHY mask , RMII enable info from platform_data */ |
@@ -1929,8 +1930,9 @@ no_dma: | |||
1929 | iounmap(priv->remap_addr); | 1930 | iounmap(priv->remap_addr); |
1930 | 1931 | ||
1931 | probe_quit: | 1932 | probe_quit: |
1932 | clk_put(emac_clk); | ||
1933 | free_netdev(ndev); | 1933 | free_netdev(ndev); |
1934 | free_clk: | ||
1935 | clk_put(emac_clk); | ||
1934 | return rc; | 1936 | return rc; |
1935 | } | 1937 | } |
1936 | 1938 | ||
diff --git a/drivers/net/depca.c b/drivers/net/depca.c index 17654059922..8b0084d17c8 100644 --- a/drivers/net/depca.c +++ b/drivers/net/depca.c | |||
@@ -331,18 +331,18 @@ static struct { | |||
331 | "DE422",\ | 331 | "DE422",\ |
332 | ""} | 332 | ""} |
333 | 333 | ||
334 | static const char* const depca_signature[] __devinitconst = DEPCA_SIGNATURE; | 334 | static char* __initdata depca_signature[] = DEPCA_SIGNATURE; |
335 | 335 | ||
336 | enum depca_type { | 336 | enum depca_type { |
337 | DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown | 337 | DEPCA, de100, de101, de200, de201, de202, de210, de212, de422, unknown |
338 | }; | 338 | }; |
339 | 339 | ||
340 | static const char depca_string[] = "depca"; | 340 | static char depca_string[] = "depca"; |
341 | 341 | ||
342 | static int depca_device_remove (struct device *device); | 342 | static int depca_device_remove (struct device *device); |
343 | 343 | ||
344 | #ifdef CONFIG_EISA | 344 | #ifdef CONFIG_EISA |
345 | static const struct eisa_device_id depca_eisa_ids[] __devinitconst = { | 345 | static struct eisa_device_id depca_eisa_ids[] = { |
346 | { "DEC4220", de422 }, | 346 | { "DEC4220", de422 }, |
347 | { "" } | 347 | { "" } |
348 | }; | 348 | }; |
@@ -367,19 +367,19 @@ static struct eisa_driver depca_eisa_driver = { | |||
367 | #define DE210_ID 0x628d | 367 | #define DE210_ID 0x628d |
368 | #define DE212_ID 0x6def | 368 | #define DE212_ID 0x6def |
369 | 369 | ||
370 | static const short depca_mca_adapter_ids[] __devinitconst = { | 370 | static short depca_mca_adapter_ids[] = { |
371 | DE210_ID, | 371 | DE210_ID, |
372 | DE212_ID, | 372 | DE212_ID, |
373 | 0x0000 | 373 | 0x0000 |
374 | }; | 374 | }; |
375 | 375 | ||
376 | static const char *depca_mca_adapter_name[] = { | 376 | static char *depca_mca_adapter_name[] = { |
377 | "DEC EtherWORKS MC Adapter (DE210)", | 377 | "DEC EtherWORKS MC Adapter (DE210)", |
378 | "DEC EtherWORKS MC Adapter (DE212)", | 378 | "DEC EtherWORKS MC Adapter (DE212)", |
379 | NULL | 379 | NULL |
380 | }; | 380 | }; |
381 | 381 | ||
382 | static const enum depca_type depca_mca_adapter_type[] = { | 382 | static enum depca_type depca_mca_adapter_type[] = { |
383 | de210, | 383 | de210, |
384 | de212, | 384 | de212, |
385 | 0 | 385 | 0 |
@@ -541,9 +541,10 @@ static void SetMulticastFilter(struct net_device *dev); | |||
541 | static int load_packet(struct net_device *dev, struct sk_buff *skb); | 541 | static int load_packet(struct net_device *dev, struct sk_buff *skb); |
542 | static void depca_dbg_open(struct net_device *dev); | 542 | static void depca_dbg_open(struct net_device *dev); |
543 | 543 | ||
544 | static const u_char de1xx_irq[] __devinitconst = { 2, 3, 4, 5, 7, 9, 0 }; | 544 | static u_char de1xx_irq[] __initdata = { 2, 3, 4, 5, 7, 9, 0 }; |
545 | static const u_char de2xx_irq[] __devinitconst = { 5, 9, 10, 11, 15, 0 }; | 545 | static u_char de2xx_irq[] __initdata = { 5, 9, 10, 11, 15, 0 }; |
546 | static const u_char de422_irq[] __devinitconst = { 5, 9, 10, 11, 0 }; | 546 | static u_char de422_irq[] __initdata = { 5, 9, 10, 11, 0 }; |
547 | static u_char *depca_irq; | ||
547 | 548 | ||
548 | static int irq; | 549 | static int irq; |
549 | static int io; | 550 | static int io; |
@@ -579,7 +580,7 @@ static const struct net_device_ops depca_netdev_ops = { | |||
579 | .ndo_validate_addr = eth_validate_addr, | 580 | .ndo_validate_addr = eth_validate_addr, |
580 | }; | 581 | }; |
581 | 582 | ||
582 | static int __devinit depca_hw_init (struct net_device *dev, struct device *device) | 583 | static int __init depca_hw_init (struct net_device *dev, struct device *device) |
583 | { | 584 | { |
584 | struct depca_private *lp; | 585 | struct depca_private *lp; |
585 | int i, j, offset, netRAM, mem_len, status = 0; | 586 | int i, j, offset, netRAM, mem_len, status = 0; |
@@ -747,7 +748,6 @@ static int __devinit depca_hw_init (struct net_device *dev, struct device *devic | |||
747 | if (dev->irq < 2) { | 748 | if (dev->irq < 2) { |
748 | unsigned char irqnum; | 749 | unsigned char irqnum; |
749 | unsigned long irq_mask, delay; | 750 | unsigned long irq_mask, delay; |
750 | const u_char *depca_irq; | ||
751 | 751 | ||
752 | irq_mask = probe_irq_on(); | 752 | irq_mask = probe_irq_on(); |
753 | 753 | ||
@@ -770,7 +770,6 @@ static int __devinit depca_hw_init (struct net_device *dev, struct device *devic | |||
770 | break; | 770 | break; |
771 | 771 | ||
772 | default: | 772 | default: |
773 | depca_irq = NULL; | ||
774 | break; /* Not reached */ | 773 | break; /* Not reached */ |
775 | } | 774 | } |
776 | 775 | ||
@@ -1303,7 +1302,7 @@ static void SetMulticastFilter(struct net_device *dev) | |||
1303 | } | 1302 | } |
1304 | } | 1303 | } |
1305 | 1304 | ||
1306 | static int __devinit depca_common_init (u_long ioaddr, struct net_device **devp) | 1305 | static int __init depca_common_init (u_long ioaddr, struct net_device **devp) |
1307 | { | 1306 | { |
1308 | int status = 0; | 1307 | int status = 0; |
1309 | 1308 | ||
@@ -1334,7 +1333,7 @@ static int __devinit depca_common_init (u_long ioaddr, struct net_device **devp) | |||
1334 | /* | 1333 | /* |
1335 | ** Microchannel bus I/O device probe | 1334 | ** Microchannel bus I/O device probe |
1336 | */ | 1335 | */ |
1337 | static int __devinit depca_mca_probe(struct device *device) | 1336 | static int __init depca_mca_probe(struct device *device) |
1338 | { | 1337 | { |
1339 | unsigned char pos[2]; | 1338 | unsigned char pos[2]; |
1340 | unsigned char where; | 1339 | unsigned char where; |
@@ -1458,7 +1457,7 @@ static int __devinit depca_mca_probe(struct device *device) | |||
1458 | ** ISA bus I/O device probe | 1457 | ** ISA bus I/O device probe |
1459 | */ | 1458 | */ |
1460 | 1459 | ||
1461 | static void __devinit depca_platform_probe (void) | 1460 | static void __init depca_platform_probe (void) |
1462 | { | 1461 | { |
1463 | int i; | 1462 | int i; |
1464 | struct platform_device *pldev; | 1463 | struct platform_device *pldev; |
@@ -1498,7 +1497,7 @@ static void __devinit depca_platform_probe (void) | |||
1498 | } | 1497 | } |
1499 | } | 1498 | } |
1500 | 1499 | ||
1501 | static enum depca_type __devinit depca_shmem_probe (ulong *mem_start) | 1500 | static enum depca_type __init depca_shmem_probe (ulong *mem_start) |
1502 | { | 1501 | { |
1503 | u_long mem_base[] = DEPCA_RAM_BASE_ADDRESSES; | 1502 | u_long mem_base[] = DEPCA_RAM_BASE_ADDRESSES; |
1504 | enum depca_type adapter = unknown; | 1503 | enum depca_type adapter = unknown; |
@@ -1559,7 +1558,7 @@ static int __devinit depca_isa_probe (struct platform_device *device) | |||
1559 | */ | 1558 | */ |
1560 | 1559 | ||
1561 | #ifdef CONFIG_EISA | 1560 | #ifdef CONFIG_EISA |
1562 | static int __devinit depca_eisa_probe (struct device *device) | 1561 | static int __init depca_eisa_probe (struct device *device) |
1563 | { | 1562 | { |
1564 | enum depca_type adapter = unknown; | 1563 | enum depca_type adapter = unknown; |
1565 | struct eisa_device *edev; | 1564 | struct eisa_device *edev; |
@@ -1630,7 +1629,7 @@ static int __devexit depca_device_remove (struct device *device) | |||
1630 | ** and Boot (readb) ROM. This will also give us a clue to the network RAM | 1629 | ** and Boot (readb) ROM. This will also give us a clue to the network RAM |
1631 | ** base address. | 1630 | ** base address. |
1632 | */ | 1631 | */ |
1633 | static int __devinit DepcaSignature(char *name, u_long base_addr) | 1632 | static int __init DepcaSignature(char *name, u_long base_addr) |
1634 | { | 1633 | { |
1635 | u_int i, j, k; | 1634 | u_int i, j, k; |
1636 | void __iomem *ptr; | 1635 | void __iomem *ptr; |
diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index c445457b66d..23179dbcedd 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c | |||
@@ -346,7 +346,7 @@ parse_eeprom (struct net_device *dev) | |||
346 | if (np->pdev->vendor == PCI_VENDOR_ID_DLINK) { /* D-Link Only */ | 346 | if (np->pdev->vendor == PCI_VENDOR_ID_DLINK) { /* D-Link Only */ |
347 | /* Check CRC */ | 347 | /* Check CRC */ |
348 | crc = ~ether_crc_le (256 - 4, sromdata); | 348 | crc = ~ether_crc_le (256 - 4, sromdata); |
349 | if (psrom->crc != crc) { | 349 | if (psrom->crc != cpu_to_le32(crc)) { |
350 | printk (KERN_ERR "%s: EEPROM data CRC error.\n", | 350 | printk (KERN_ERR "%s: EEPROM data CRC error.\n", |
351 | dev->name); | 351 | dev->name); |
352 | return -1; | 352 | return -1; |
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index fbaff3584bd..ee597e676ee 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c | |||
@@ -1157,9 +1157,6 @@ dm9000_open(struct net_device *dev) | |||
1157 | 1157 | ||
1158 | irqflags |= IRQF_SHARED; | 1158 | irqflags |= IRQF_SHARED; |
1159 | 1159 | ||
1160 | if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev)) | ||
1161 | return -EAGAIN; | ||
1162 | |||
1163 | /* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */ | 1160 | /* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */ |
1164 | iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */ | 1161 | iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */ |
1165 | mdelay(1); /* delay needs by DM9000B */ | 1162 | mdelay(1); /* delay needs by DM9000B */ |
@@ -1168,6 +1165,9 @@ dm9000_open(struct net_device *dev) | |||
1168 | dm9000_reset(db); | 1165 | dm9000_reset(db); |
1169 | dm9000_init_dm9000(dev); | 1166 | dm9000_init_dm9000(dev); |
1170 | 1167 | ||
1168 | if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev)) | ||
1169 | return -EAGAIN; | ||
1170 | |||
1171 | /* Init driver variable */ | 1171 | /* Init driver variable */ |
1172 | db->dbug_cnt = 0; | 1172 | db->dbug_cnt = 0; |
1173 | 1173 | ||
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index d9600566a1f..3310c3d477d 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -5361,7 +5361,7 @@ static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep, | |||
5361 | #ifdef CONFIG_PCIEASPM | 5361 | #ifdef CONFIG_PCIEASPM |
5362 | static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state) | 5362 | static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state) |
5363 | { | 5363 | { |
5364 | pci_disable_link_state(pdev, state); | 5364 | pci_disable_link_state_locked(pdev, state); |
5365 | } | 5365 | } |
5366 | #else | 5366 | #else |
5367 | static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state) | 5367 | static void __e1000e_disable_aspm(struct pci_dev *pdev, u16 state) |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index ff60b23a5b7..2dfcc804784 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * Maintainer: Kumar Gala | 10 | * Maintainer: Kumar Gala |
11 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 11 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
12 | * | 12 | * |
13 | * Copyright 2002-2009 Freescale Semiconductor, Inc. | 13 | * Copyright 2002-2009, 2011 Freescale Semiconductor, Inc. |
14 | * Copyright 2007 MontaVista Software, Inc. | 14 | * Copyright 2007 MontaVista Software, Inc. |
15 | * | 15 | * |
16 | * This program is free software; you can redistribute it and/or modify it | 16 | * This program is free software; you can redistribute it and/or modify it |
@@ -476,9 +476,6 @@ static const struct net_device_ops gfar_netdev_ops = { | |||
476 | #endif | 476 | #endif |
477 | }; | 477 | }; |
478 | 478 | ||
479 | unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
480 | unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
481 | |||
482 | void lock_rx_qs(struct gfar_private *priv) | 479 | void lock_rx_qs(struct gfar_private *priv) |
483 | { | 480 | { |
484 | int i = 0x0; | 481 | int i = 0x0; |
@@ -868,28 +865,28 @@ static u32 cluster_entry_per_class(struct gfar_private *priv, u32 rqfar, | |||
868 | 865 | ||
869 | rqfar--; | 866 | rqfar--; |
870 | rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT; | 867 | rqfcr = RQFCR_CLE | RQFCR_PID_MASK | RQFCR_CMP_EXACT; |
871 | ftp_rqfpr[rqfar] = rqfpr; | 868 | priv->ftp_rqfpr[rqfar] = rqfpr; |
872 | ftp_rqfcr[rqfar] = rqfcr; | 869 | priv->ftp_rqfcr[rqfar] = rqfcr; |
873 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 870 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
874 | 871 | ||
875 | rqfar--; | 872 | rqfar--; |
876 | rqfcr = RQFCR_CMP_NOMATCH; | 873 | rqfcr = RQFCR_CMP_NOMATCH; |
877 | ftp_rqfpr[rqfar] = rqfpr; | 874 | priv->ftp_rqfpr[rqfar] = rqfpr; |
878 | ftp_rqfcr[rqfar] = rqfcr; | 875 | priv->ftp_rqfcr[rqfar] = rqfcr; |
879 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 876 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
880 | 877 | ||
881 | rqfar--; | 878 | rqfar--; |
882 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND; | 879 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_PARSE | RQFCR_CLE | RQFCR_AND; |
883 | rqfpr = class; | 880 | rqfpr = class; |
884 | ftp_rqfcr[rqfar] = rqfcr; | 881 | priv->ftp_rqfcr[rqfar] = rqfcr; |
885 | ftp_rqfpr[rqfar] = rqfpr; | 882 | priv->ftp_rqfpr[rqfar] = rqfpr; |
886 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 883 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
887 | 884 | ||
888 | rqfar--; | 885 | rqfar--; |
889 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND; | 886 | rqfcr = RQFCR_CMP_EXACT | RQFCR_PID_MASK | RQFCR_AND; |
890 | rqfpr = class; | 887 | rqfpr = class; |
891 | ftp_rqfcr[rqfar] = rqfcr; | 888 | priv->ftp_rqfcr[rqfar] = rqfcr; |
892 | ftp_rqfpr[rqfar] = rqfpr; | 889 | priv->ftp_rqfpr[rqfar] = rqfpr; |
893 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 890 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
894 | 891 | ||
895 | return rqfar; | 892 | return rqfar; |
@@ -904,8 +901,8 @@ static void gfar_init_filer_table(struct gfar_private *priv) | |||
904 | 901 | ||
905 | /* Default rule */ | 902 | /* Default rule */ |
906 | rqfcr = RQFCR_CMP_MATCH; | 903 | rqfcr = RQFCR_CMP_MATCH; |
907 | ftp_rqfcr[rqfar] = rqfcr; | 904 | priv->ftp_rqfcr[rqfar] = rqfcr; |
908 | ftp_rqfpr[rqfar] = rqfpr; | 905 | priv->ftp_rqfpr[rqfar] = rqfpr; |
909 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); | 906 | gfar_write_filer(priv, rqfar, rqfcr, rqfpr); |
910 | 907 | ||
911 | rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6); | 908 | rqfar = cluster_entry_per_class(priv, rqfar, RQFPR_IPV6); |
@@ -921,8 +918,8 @@ static void gfar_init_filer_table(struct gfar_private *priv) | |||
921 | /* Rest are masked rules */ | 918 | /* Rest are masked rules */ |
922 | rqfcr = RQFCR_CMP_NOMATCH; | 919 | rqfcr = RQFCR_CMP_NOMATCH; |
923 | for (i = 0; i < rqfar; i++) { | 920 | for (i = 0; i < rqfar; i++) { |
924 | ftp_rqfcr[i] = rqfcr; | 921 | priv->ftp_rqfcr[i] = rqfcr; |
925 | ftp_rqfpr[i] = rqfpr; | 922 | priv->ftp_rqfpr[i] = rqfpr; |
926 | gfar_write_filer(priv, i, rqfcr, rqfpr); | 923 | gfar_write_filer(priv, i, rqfcr, rqfpr); |
927 | } | 924 | } |
928 | } | 925 | } |
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index fc86f519544..ba36dc7a343 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
@@ -9,7 +9,7 @@ | |||
9 | * Maintainer: Kumar Gala | 9 | * Maintainer: Kumar Gala |
10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
11 | * | 11 | * |
12 | * Copyright 2002-2009 Freescale Semiconductor, Inc. | 12 | * Copyright 2002-2009, 2011 Freescale Semiconductor, Inc. |
13 | * | 13 | * |
14 | * This program is free software; you can redistribute it and/or modify it | 14 | * This program is free software; you can redistribute it and/or modify it |
15 | * under the terms of the GNU General Public License as published by the | 15 | * under the terms of the GNU General Public License as published by the |
@@ -1107,10 +1107,12 @@ struct gfar_private { | |||
1107 | /* HW time stamping enabled flag */ | 1107 | /* HW time stamping enabled flag */ |
1108 | int hwts_rx_en; | 1108 | int hwts_rx_en; |
1109 | int hwts_tx_en; | 1109 | int hwts_tx_en; |
1110 | |||
1111 | /*Filer table*/ | ||
1112 | unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
1113 | unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
1110 | }; | 1114 | }; |
1111 | 1115 | ||
1112 | extern unsigned int ftp_rqfpr[MAX_FILER_IDX + 1]; | ||
1113 | extern unsigned int ftp_rqfcr[MAX_FILER_IDX + 1]; | ||
1114 | 1116 | ||
1115 | static inline int gfar_has_errata(struct gfar_private *priv, | 1117 | static inline int gfar_has_errata(struct gfar_private *priv, |
1116 | enum gfar_errata err) | 1118 | enum gfar_errata err) |
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index 493d743839d..239e3330495 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * Maintainer: Kumar Gala | 9 | * Maintainer: Kumar Gala |
10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> | 10 | * Modifier: Sandeep Gopalpet <sandeep.kumar@freescale.com> |
11 | * | 11 | * |
12 | * Copyright 2003-2006, 2008-2009 Freescale Semiconductor, Inc. | 12 | * Copyright 2003-2006, 2008-2009, 2011 Freescale Semiconductor, Inc. |
13 | * | 13 | * |
14 | * This software may be used and distributed according to | 14 | * This software may be used and distributed according to |
15 | * the terms of the GNU Public License, Version 2, incorporated herein | 15 | * the terms of the GNU Public License, Version 2, incorporated herein |
@@ -609,15 +609,15 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
609 | if (ethflow & RXH_L2DA) { | 609 | if (ethflow & RXH_L2DA) { |
610 | fcr = RQFCR_PID_DAH |RQFCR_CMP_NOMATCH | | 610 | fcr = RQFCR_PID_DAH |RQFCR_CMP_NOMATCH | |
611 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; | 611 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; |
612 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 612 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
613 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 613 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
614 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 614 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
615 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 615 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
616 | 616 | ||
617 | fcr = RQFCR_PID_DAL | RQFCR_AND | RQFCR_CMP_NOMATCH | | 617 | fcr = RQFCR_PID_DAL | RQFCR_AND | RQFCR_CMP_NOMATCH | |
618 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; | 618 | RQFCR_HASH | RQFCR_AND | RQFCR_HASHTBL_0; |
619 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 619 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
620 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 620 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
621 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 621 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
622 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 622 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
623 | } | 623 | } |
@@ -626,16 +626,16 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
626 | fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 626 | fcr = RQFCR_PID_VID | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
627 | RQFCR_AND | RQFCR_HASHTBL_0; | 627 | RQFCR_AND | RQFCR_HASHTBL_0; |
628 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 628 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
629 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 629 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
630 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 630 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
631 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 631 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
632 | } | 632 | } |
633 | 633 | ||
634 | if (ethflow & RXH_IP_SRC) { | 634 | if (ethflow & RXH_IP_SRC) { |
635 | fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 635 | fcr = RQFCR_PID_SIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
636 | RQFCR_AND | RQFCR_HASHTBL_0; | 636 | RQFCR_AND | RQFCR_HASHTBL_0; |
637 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 637 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
638 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 638 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
639 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 639 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
640 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 640 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
641 | } | 641 | } |
@@ -643,8 +643,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
643 | if (ethflow & (RXH_IP_DST)) { | 643 | if (ethflow & (RXH_IP_DST)) { |
644 | fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 644 | fcr = RQFCR_PID_DIA | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
645 | RQFCR_AND | RQFCR_HASHTBL_0; | 645 | RQFCR_AND | RQFCR_HASHTBL_0; |
646 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 646 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
647 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 647 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
648 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 648 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
649 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 649 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
650 | } | 650 | } |
@@ -652,8 +652,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
652 | if (ethflow & RXH_L3_PROTO) { | 652 | if (ethflow & RXH_L3_PROTO) { |
653 | fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 653 | fcr = RQFCR_PID_L4P | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
654 | RQFCR_AND | RQFCR_HASHTBL_0; | 654 | RQFCR_AND | RQFCR_HASHTBL_0; |
655 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 655 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
656 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 656 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
657 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 657 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
658 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 658 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
659 | } | 659 | } |
@@ -661,8 +661,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
661 | if (ethflow & RXH_L4_B_0_1) { | 661 | if (ethflow & RXH_L4_B_0_1) { |
662 | fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 662 | fcr = RQFCR_PID_SPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
663 | RQFCR_AND | RQFCR_HASHTBL_0; | 663 | RQFCR_AND | RQFCR_HASHTBL_0; |
664 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 664 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
665 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 665 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
666 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 666 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
667 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 667 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
668 | } | 668 | } |
@@ -670,8 +670,8 @@ static void ethflow_to_filer_rules (struct gfar_private *priv, u64 ethflow) | |||
670 | if (ethflow & RXH_L4_B_2_3) { | 670 | if (ethflow & RXH_L4_B_2_3) { |
671 | fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | | 671 | fcr = RQFCR_PID_DPT | RQFCR_CMP_NOMATCH | RQFCR_HASH | |
672 | RQFCR_AND | RQFCR_HASHTBL_0; | 672 | RQFCR_AND | RQFCR_HASHTBL_0; |
673 | ftp_rqfpr[priv->cur_filer_idx] = fpr; | 673 | priv->ftp_rqfpr[priv->cur_filer_idx] = fpr; |
674 | ftp_rqfcr[priv->cur_filer_idx] = fcr; | 674 | priv->ftp_rqfcr[priv->cur_filer_idx] = fcr; |
675 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); | 675 | gfar_write_filer(priv, priv->cur_filer_idx, fcr, fpr); |
676 | priv->cur_filer_idx = priv->cur_filer_idx - 1; | 676 | priv->cur_filer_idx = priv->cur_filer_idx - 1; |
677 | } | 677 | } |
@@ -705,12 +705,12 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
705 | } | 705 | } |
706 | 706 | ||
707 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { | 707 | for (i = 0; i < MAX_FILER_IDX + 1; i++) { |
708 | local_rqfpr[j] = ftp_rqfpr[i]; | 708 | local_rqfpr[j] = priv->ftp_rqfpr[i]; |
709 | local_rqfcr[j] = ftp_rqfcr[i]; | 709 | local_rqfcr[j] = priv->ftp_rqfcr[i]; |
710 | j--; | 710 | j--; |
711 | if ((ftp_rqfcr[i] == (RQFCR_PID_PARSE | | 711 | if ((priv->ftp_rqfcr[i] == (RQFCR_PID_PARSE | |
712 | RQFCR_CLE |RQFCR_AND)) && | 712 | RQFCR_CLE |RQFCR_AND)) && |
713 | (ftp_rqfpr[i] == cmp_rqfpr)) | 713 | (priv->ftp_rqfpr[i] == cmp_rqfpr)) |
714 | break; | 714 | break; |
715 | } | 715 | } |
716 | 716 | ||
@@ -724,20 +724,22 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
724 | * if it was already programmed, we need to overwrite these rules | 724 | * if it was already programmed, we need to overwrite these rules |
725 | */ | 725 | */ |
726 | for (l = i+1; l < MAX_FILER_IDX; l++) { | 726 | for (l = i+1; l < MAX_FILER_IDX; l++) { |
727 | if ((ftp_rqfcr[l] & RQFCR_CLE) && | 727 | if ((priv->ftp_rqfcr[l] & RQFCR_CLE) && |
728 | !(ftp_rqfcr[l] & RQFCR_AND)) { | 728 | !(priv->ftp_rqfcr[l] & RQFCR_AND)) { |
729 | ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT | | 729 | priv->ftp_rqfcr[l] = RQFCR_CLE | RQFCR_CMP_EXACT | |
730 | RQFCR_HASHTBL_0 | RQFCR_PID_MASK; | 730 | RQFCR_HASHTBL_0 | RQFCR_PID_MASK; |
731 | ftp_rqfpr[l] = FPR_FILER_MASK; | 731 | priv->ftp_rqfpr[l] = FPR_FILER_MASK; |
732 | gfar_write_filer(priv, l, ftp_rqfcr[l], ftp_rqfpr[l]); | 732 | gfar_write_filer(priv, l, priv->ftp_rqfcr[l], |
733 | priv->ftp_rqfpr[l]); | ||
733 | break; | 734 | break; |
734 | } | 735 | } |
735 | 736 | ||
736 | if (!(ftp_rqfcr[l] & RQFCR_CLE) && (ftp_rqfcr[l] & RQFCR_AND)) | 737 | if (!(priv->ftp_rqfcr[l] & RQFCR_CLE) && |
738 | (priv->ftp_rqfcr[l] & RQFCR_AND)) | ||
737 | continue; | 739 | continue; |
738 | else { | 740 | else { |
739 | local_rqfpr[j] = ftp_rqfpr[l]; | 741 | local_rqfpr[j] = priv->ftp_rqfpr[l]; |
740 | local_rqfcr[j] = ftp_rqfcr[l]; | 742 | local_rqfcr[j] = priv->ftp_rqfcr[l]; |
741 | j--; | 743 | j--; |
742 | } | 744 | } |
743 | } | 745 | } |
@@ -750,8 +752,8 @@ static int gfar_ethflow_to_filer_table(struct gfar_private *priv, u64 ethflow, u | |||
750 | 752 | ||
751 | /* Write back the popped out rules again */ | 753 | /* Write back the popped out rules again */ |
752 | for (k = j+1; k < MAX_FILER_IDX; k++) { | 754 | for (k = j+1; k < MAX_FILER_IDX; k++) { |
753 | ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k]; | 755 | priv->ftp_rqfpr[priv->cur_filer_idx] = local_rqfpr[k]; |
754 | ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k]; | 756 | priv->ftp_rqfcr[priv->cur_filer_idx] = local_rqfcr[k]; |
755 | gfar_write_filer(priv, priv->cur_filer_idx, | 757 | gfar_write_filer(priv, priv->cur_filer_idx, |
756 | local_rqfcr[k], local_rqfpr[k]); | 758 | local_rqfcr[k], local_rqfpr[k]); |
757 | if (!priv->cur_filer_idx) | 759 | if (!priv->cur_filer_idx) |
diff --git a/drivers/net/gianfar_ptp.c b/drivers/net/gianfar_ptp.c new file mode 100644 index 00000000000..d8e175382d1 --- /dev/null +++ b/drivers/net/gianfar_ptp.c | |||
@@ -0,0 +1,588 @@ | |||
1 | /* | ||
2 | * PTP 1588 clock using the eTSEC | ||
3 | * | ||
4 | * Copyright (C) 2010 OMICRON electronics GmbH | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | #include <linux/device.h> | ||
21 | #include <linux/hrtimer.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/of.h> | ||
27 | #include <linux/of_platform.h> | ||
28 | #include <linux/timex.h> | ||
29 | #include <linux/io.h> | ||
30 | |||
31 | #include <linux/ptp_clock_kernel.h> | ||
32 | |||
33 | #include "gianfar.h" | ||
34 | |||
35 | /* | ||
36 | * gianfar ptp registers | ||
37 | * Generated by regen.tcl on Thu May 13 01:38:57 PM CEST 2010 | ||
38 | */ | ||
39 | struct gianfar_ptp_registers { | ||
40 | u32 tmr_ctrl; /* Timer control register */ | ||
41 | u32 tmr_tevent; /* Timestamp event register */ | ||
42 | u32 tmr_temask; /* Timer event mask register */ | ||
43 | u32 tmr_pevent; /* Timestamp event register */ | ||
44 | u32 tmr_pemask; /* Timer event mask register */ | ||
45 | u32 tmr_stat; /* Timestamp status register */ | ||
46 | u32 tmr_cnt_h; /* Timer counter high register */ | ||
47 | u32 tmr_cnt_l; /* Timer counter low register */ | ||
48 | u32 tmr_add; /* Timer drift compensation addend register */ | ||
49 | u32 tmr_acc; /* Timer accumulator register */ | ||
50 | u32 tmr_prsc; /* Timer prescale */ | ||
51 | u8 res1[4]; | ||
52 | u32 tmroff_h; /* Timer offset high */ | ||
53 | u32 tmroff_l; /* Timer offset low */ | ||
54 | u8 res2[8]; | ||
55 | u32 tmr_alarm1_h; /* Timer alarm 1 high register */ | ||
56 | u32 tmr_alarm1_l; /* Timer alarm 1 high register */ | ||
57 | u32 tmr_alarm2_h; /* Timer alarm 2 high register */ | ||
58 | u32 tmr_alarm2_l; /* Timer alarm 2 high register */ | ||
59 | u8 res3[48]; | ||
60 | u32 tmr_fiper1; /* Timer fixed period interval */ | ||
61 | u32 tmr_fiper2; /* Timer fixed period interval */ | ||
62 | u32 tmr_fiper3; /* Timer fixed period interval */ | ||
63 | u8 res4[20]; | ||
64 | u32 tmr_etts1_h; /* Timestamp of general purpose external trigger */ | ||
65 | u32 tmr_etts1_l; /* Timestamp of general purpose external trigger */ | ||
66 | u32 tmr_etts2_h; /* Timestamp of general purpose external trigger */ | ||
67 | u32 tmr_etts2_l; /* Timestamp of general purpose external trigger */ | ||
68 | }; | ||
69 | |||
70 | /* Bit definitions for the TMR_CTRL register */ | ||
71 | #define ALM1P (1<<31) /* Alarm1 output polarity */ | ||
72 | #define ALM2P (1<<30) /* Alarm2 output polarity */ | ||
73 | #define FS (1<<28) /* FIPER start indication */ | ||
74 | #define PP1L (1<<27) /* Fiper1 pulse loopback mode enabled. */ | ||
75 | #define PP2L (1<<26) /* Fiper2 pulse loopback mode enabled. */ | ||
76 | #define TCLK_PERIOD_SHIFT (16) /* 1588 timer reference clock period. */ | ||
77 | #define TCLK_PERIOD_MASK (0x3ff) | ||
78 | #define RTPE (1<<15) /* Record Tx Timestamp to PAL Enable. */ | ||
79 | #define FRD (1<<14) /* FIPER Realignment Disable */ | ||
80 | #define ESFDP (1<<11) /* External Tx/Rx SFD Polarity. */ | ||
81 | #define ESFDE (1<<10) /* External Tx/Rx SFD Enable. */ | ||
82 | #define ETEP2 (1<<9) /* External trigger 2 edge polarity */ | ||
83 | #define ETEP1 (1<<8) /* External trigger 1 edge polarity */ | ||
84 | #define COPH (1<<7) /* Generated clock output phase. */ | ||
85 | #define CIPH (1<<6) /* External oscillator input clock phase */ | ||
86 | #define TMSR (1<<5) /* Timer soft reset. */ | ||
87 | #define BYP (1<<3) /* Bypass drift compensated clock */ | ||
88 | #define TE (1<<2) /* 1588 timer enable. */ | ||
89 | #define CKSEL_SHIFT (0) /* 1588 Timer reference clock source */ | ||
90 | #define CKSEL_MASK (0x3) | ||
91 | |||
92 | /* Bit definitions for the TMR_TEVENT register */ | ||
93 | #define ETS2 (1<<25) /* External trigger 2 timestamp sampled */ | ||
94 | #define ETS1 (1<<24) /* External trigger 1 timestamp sampled */ | ||
95 | #define ALM2 (1<<17) /* Current time = alarm time register 2 */ | ||
96 | #define ALM1 (1<<16) /* Current time = alarm time register 1 */ | ||
97 | #define PP1 (1<<7) /* periodic pulse generated on FIPER1 */ | ||
98 | #define PP2 (1<<6) /* periodic pulse generated on FIPER2 */ | ||
99 | #define PP3 (1<<5) /* periodic pulse generated on FIPER3 */ | ||
100 | |||
101 | /* Bit definitions for the TMR_TEMASK register */ | ||
102 | #define ETS2EN (1<<25) /* External trigger 2 timestamp enable */ | ||
103 | #define ETS1EN (1<<24) /* External trigger 1 timestamp enable */ | ||
104 | #define ALM2EN (1<<17) /* Timer ALM2 event enable */ | ||
105 | #define ALM1EN (1<<16) /* Timer ALM1 event enable */ | ||
106 | #define PP1EN (1<<7) /* Periodic pulse event 1 enable */ | ||
107 | #define PP2EN (1<<6) /* Periodic pulse event 2 enable */ | ||
108 | |||
109 | /* Bit definitions for the TMR_PEVENT register */ | ||
110 | #define TXP2 (1<<9) /* PTP transmitted timestamp im TXTS2 */ | ||
111 | #define TXP1 (1<<8) /* PTP transmitted timestamp in TXTS1 */ | ||
112 | #define RXP (1<<0) /* PTP frame has been received */ | ||
113 | |||
114 | /* Bit definitions for the TMR_PEMASK register */ | ||
115 | #define TXP2EN (1<<9) /* Transmit PTP packet event 2 enable */ | ||
116 | #define TXP1EN (1<<8) /* Transmit PTP packet event 1 enable */ | ||
117 | #define RXPEN (1<<0) /* Receive PTP packet event enable */ | ||
118 | |||
119 | /* Bit definitions for the TMR_STAT register */ | ||
120 | #define STAT_VEC_SHIFT (0) /* Timer general purpose status vector */ | ||
121 | #define STAT_VEC_MASK (0x3f) | ||
122 | |||
123 | /* Bit definitions for the TMR_PRSC register */ | ||
124 | #define PRSC_OCK_SHIFT (0) /* Output clock division/prescale factor. */ | ||
125 | #define PRSC_OCK_MASK (0xffff) | ||
126 | |||
127 | |||
128 | #define DRIVER "gianfar_ptp" | ||
129 | #define DEFAULT_CKSEL 1 | ||
130 | #define N_ALARM 1 /* first alarm is used internally to reset fipers */ | ||
131 | #define N_EXT_TS 2 | ||
132 | #define REG_SIZE sizeof(struct gianfar_ptp_registers) | ||
133 | |||
134 | struct etsects { | ||
135 | struct gianfar_ptp_registers *regs; | ||
136 | spinlock_t lock; /* protects regs */ | ||
137 | struct ptp_clock *clock; | ||
138 | struct ptp_clock_info caps; | ||
139 | struct resource *rsrc; | ||
140 | int irq; | ||
141 | u64 alarm_interval; /* for periodic alarm */ | ||
142 | u64 alarm_value; | ||
143 | u32 tclk_period; /* nanoseconds */ | ||
144 | u32 tmr_prsc; | ||
145 | u32 tmr_add; | ||
146 | u32 cksel; | ||
147 | u32 tmr_fiper1; | ||
148 | u32 tmr_fiper2; | ||
149 | }; | ||
150 | |||
151 | /* | ||
152 | * Register access functions | ||
153 | */ | ||
154 | |||
155 | /* Caller must hold etsects->lock. */ | ||
156 | static u64 tmr_cnt_read(struct etsects *etsects) | ||
157 | { | ||
158 | u64 ns; | ||
159 | u32 lo, hi; | ||
160 | |||
161 | lo = gfar_read(&etsects->regs->tmr_cnt_l); | ||
162 | hi = gfar_read(&etsects->regs->tmr_cnt_h); | ||
163 | ns = ((u64) hi) << 32; | ||
164 | ns |= lo; | ||
165 | return ns; | ||
166 | } | ||
167 | |||
168 | /* Caller must hold etsects->lock. */ | ||
169 | static void tmr_cnt_write(struct etsects *etsects, u64 ns) | ||
170 | { | ||
171 | u32 hi = ns >> 32; | ||
172 | u32 lo = ns & 0xffffffff; | ||
173 | |||
174 | gfar_write(&etsects->regs->tmr_cnt_l, lo); | ||
175 | gfar_write(&etsects->regs->tmr_cnt_h, hi); | ||
176 | } | ||
177 | |||
178 | /* Caller must hold etsects->lock. */ | ||
179 | static void set_alarm(struct etsects *etsects) | ||
180 | { | ||
181 | u64 ns; | ||
182 | u32 lo, hi; | ||
183 | |||
184 | ns = tmr_cnt_read(etsects) + 1500000000ULL; | ||
185 | ns = div_u64(ns, 1000000000UL) * 1000000000ULL; | ||
186 | ns -= etsects->tclk_period; | ||
187 | hi = ns >> 32; | ||
188 | lo = ns & 0xffffffff; | ||
189 | gfar_write(&etsects->regs->tmr_alarm1_l, lo); | ||
190 | gfar_write(&etsects->regs->tmr_alarm1_h, hi); | ||
191 | } | ||
192 | |||
193 | /* Caller must hold etsects->lock. */ | ||
194 | static void set_fipers(struct etsects *etsects) | ||
195 | { | ||
196 | u32 tmr_ctrl = gfar_read(&etsects->regs->tmr_ctrl); | ||
197 | |||
198 | gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl & (~TE)); | ||
199 | gfar_write(&etsects->regs->tmr_prsc, etsects->tmr_prsc); | ||
200 | gfar_write(&etsects->regs->tmr_fiper1, etsects->tmr_fiper1); | ||
201 | gfar_write(&etsects->regs->tmr_fiper2, etsects->tmr_fiper2); | ||
202 | set_alarm(etsects); | ||
203 | gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl|TE); | ||
204 | } | ||
205 | |||
206 | /* | ||
207 | * Interrupt service routine | ||
208 | */ | ||
209 | |||
210 | static irqreturn_t isr(int irq, void *priv) | ||
211 | { | ||
212 | struct etsects *etsects = priv; | ||
213 | struct ptp_clock_event event; | ||
214 | u64 ns; | ||
215 | u32 ack = 0, lo, hi, mask, val; | ||
216 | |||
217 | val = gfar_read(&etsects->regs->tmr_tevent); | ||
218 | |||
219 | if (val & ETS1) { | ||
220 | ack |= ETS1; | ||
221 | hi = gfar_read(&etsects->regs->tmr_etts1_h); | ||
222 | lo = gfar_read(&etsects->regs->tmr_etts1_l); | ||
223 | event.type = PTP_CLOCK_EXTTS; | ||
224 | event.index = 0; | ||
225 | event.timestamp = ((u64) hi) << 32; | ||
226 | event.timestamp |= lo; | ||
227 | ptp_clock_event(etsects->clock, &event); | ||
228 | } | ||
229 | |||
230 | if (val & ETS2) { | ||
231 | ack |= ETS2; | ||
232 | hi = gfar_read(&etsects->regs->tmr_etts2_h); | ||
233 | lo = gfar_read(&etsects->regs->tmr_etts2_l); | ||
234 | event.type = PTP_CLOCK_EXTTS; | ||
235 | event.index = 1; | ||
236 | event.timestamp = ((u64) hi) << 32; | ||
237 | event.timestamp |= lo; | ||
238 | ptp_clock_event(etsects->clock, &event); | ||
239 | } | ||
240 | |||
241 | if (val & ALM2) { | ||
242 | ack |= ALM2; | ||
243 | if (etsects->alarm_value) { | ||
244 | event.type = PTP_CLOCK_ALARM; | ||
245 | event.index = 0; | ||
246 | event.timestamp = etsects->alarm_value; | ||
247 | ptp_clock_event(etsects->clock, &event); | ||
248 | } | ||
249 | if (etsects->alarm_interval) { | ||
250 | ns = etsects->alarm_value + etsects->alarm_interval; | ||
251 | hi = ns >> 32; | ||
252 | lo = ns & 0xffffffff; | ||
253 | spin_lock(&etsects->lock); | ||
254 | gfar_write(&etsects->regs->tmr_alarm2_l, lo); | ||
255 | gfar_write(&etsects->regs->tmr_alarm2_h, hi); | ||
256 | spin_unlock(&etsects->lock); | ||
257 | etsects->alarm_value = ns; | ||
258 | } else { | ||
259 | gfar_write(&etsects->regs->tmr_tevent, ALM2); | ||
260 | spin_lock(&etsects->lock); | ||
261 | mask = gfar_read(&etsects->regs->tmr_temask); | ||
262 | mask &= ~ALM2EN; | ||
263 | gfar_write(&etsects->regs->tmr_temask, mask); | ||
264 | spin_unlock(&etsects->lock); | ||
265 | etsects->alarm_value = 0; | ||
266 | etsects->alarm_interval = 0; | ||
267 | } | ||
268 | } | ||
269 | |||
270 | if (val & PP1) { | ||
271 | ack |= PP1; | ||
272 | event.type = PTP_CLOCK_PPS; | ||
273 | ptp_clock_event(etsects->clock, &event); | ||
274 | } | ||
275 | |||
276 | if (ack) { | ||
277 | gfar_write(&etsects->regs->tmr_tevent, ack); | ||
278 | return IRQ_HANDLED; | ||
279 | } else | ||
280 | return IRQ_NONE; | ||
281 | } | ||
282 | |||
283 | /* | ||
284 | * PTP clock operations | ||
285 | */ | ||
286 | |||
287 | static int ptp_gianfar_adjfreq(struct ptp_clock_info *ptp, s32 ppb) | ||
288 | { | ||
289 | u64 adj; | ||
290 | u32 diff, tmr_add; | ||
291 | int neg_adj = 0; | ||
292 | struct etsects *etsects = container_of(ptp, struct etsects, caps); | ||
293 | |||
294 | if (ppb < 0) { | ||
295 | neg_adj = 1; | ||
296 | ppb = -ppb; | ||
297 | } | ||
298 | tmr_add = etsects->tmr_add; | ||
299 | adj = tmr_add; | ||
300 | adj *= ppb; | ||
301 | diff = div_u64(adj, 1000000000ULL); | ||
302 | |||
303 | tmr_add = neg_adj ? tmr_add - diff : tmr_add + diff; | ||
304 | |||
305 | gfar_write(&etsects->regs->tmr_add, tmr_add); | ||
306 | |||
307 | return 0; | ||
308 | } | ||
309 | |||
310 | static int ptp_gianfar_adjtime(struct ptp_clock_info *ptp, s64 delta) | ||
311 | { | ||
312 | s64 now; | ||
313 | unsigned long flags; | ||
314 | struct etsects *etsects = container_of(ptp, struct etsects, caps); | ||
315 | |||
316 | spin_lock_irqsave(&etsects->lock, flags); | ||
317 | |||
318 | now = tmr_cnt_read(etsects); | ||
319 | now += delta; | ||
320 | tmr_cnt_write(etsects, now); | ||
321 | |||
322 | spin_unlock_irqrestore(&etsects->lock, flags); | ||
323 | |||
324 | set_fipers(etsects); | ||
325 | |||
326 | return 0; | ||
327 | } | ||
328 | |||
329 | static int ptp_gianfar_gettime(struct ptp_clock_info *ptp, struct timespec *ts) | ||
330 | { | ||
331 | u64 ns; | ||
332 | u32 remainder; | ||
333 | unsigned long flags; | ||
334 | struct etsects *etsects = container_of(ptp, struct etsects, caps); | ||
335 | |||
336 | spin_lock_irqsave(&etsects->lock, flags); | ||
337 | |||
338 | ns = tmr_cnt_read(etsects); | ||
339 | |||
340 | spin_unlock_irqrestore(&etsects->lock, flags); | ||
341 | |||
342 | ts->tv_sec = div_u64_rem(ns, 1000000000, &remainder); | ||
343 | ts->tv_nsec = remainder; | ||
344 | return 0; | ||
345 | } | ||
346 | |||
347 | static int ptp_gianfar_settime(struct ptp_clock_info *ptp, | ||
348 | const struct timespec *ts) | ||
349 | { | ||
350 | u64 ns; | ||
351 | unsigned long flags; | ||
352 | struct etsects *etsects = container_of(ptp, struct etsects, caps); | ||
353 | |||
354 | ns = ts->tv_sec * 1000000000ULL; | ||
355 | ns += ts->tv_nsec; | ||
356 | |||
357 | spin_lock_irqsave(&etsects->lock, flags); | ||
358 | |||
359 | tmr_cnt_write(etsects, ns); | ||
360 | set_fipers(etsects); | ||
361 | |||
362 | spin_unlock_irqrestore(&etsects->lock, flags); | ||
363 | |||
364 | return 0; | ||
365 | } | ||
366 | |||
367 | static int ptp_gianfar_enable(struct ptp_clock_info *ptp, | ||
368 | struct ptp_clock_request *rq, int on) | ||
369 | { | ||
370 | struct etsects *etsects = container_of(ptp, struct etsects, caps); | ||
371 | unsigned long flags; | ||
372 | u32 bit, mask; | ||
373 | |||
374 | switch (rq->type) { | ||
375 | case PTP_CLK_REQ_EXTTS: | ||
376 | switch (rq->extts.index) { | ||
377 | case 0: | ||
378 | bit = ETS1EN; | ||
379 | break; | ||
380 | case 1: | ||
381 | bit = ETS2EN; | ||
382 | break; | ||
383 | default: | ||
384 | return -EINVAL; | ||
385 | } | ||
386 | spin_lock_irqsave(&etsects->lock, flags); | ||
387 | mask = gfar_read(&etsects->regs->tmr_temask); | ||
388 | if (on) | ||
389 | mask |= bit; | ||
390 | else | ||
391 | mask &= ~bit; | ||
392 | gfar_write(&etsects->regs->tmr_temask, mask); | ||
393 | spin_unlock_irqrestore(&etsects->lock, flags); | ||
394 | return 0; | ||
395 | |||
396 | case PTP_CLK_REQ_PPS: | ||
397 | spin_lock_irqsave(&etsects->lock, flags); | ||
398 | mask = gfar_read(&etsects->regs->tmr_temask); | ||
399 | if (on) | ||
400 | mask |= PP1EN; | ||
401 | else | ||
402 | mask &= ~PP1EN; | ||
403 | gfar_write(&etsects->regs->tmr_temask, mask); | ||
404 | spin_unlock_irqrestore(&etsects->lock, flags); | ||
405 | return 0; | ||
406 | |||
407 | default: | ||
408 | break; | ||
409 | } | ||
410 | |||
411 | return -EOPNOTSUPP; | ||
412 | } | ||
413 | |||
414 | static struct ptp_clock_info ptp_gianfar_caps = { | ||
415 | .owner = THIS_MODULE, | ||
416 | .name = "gianfar clock", | ||
417 | .max_adj = 512000, | ||
418 | .n_alarm = N_ALARM, | ||
419 | .n_ext_ts = N_EXT_TS, | ||
420 | .n_per_out = 0, | ||
421 | .pps = 1, | ||
422 | .adjfreq = ptp_gianfar_adjfreq, | ||
423 | .adjtime = ptp_gianfar_adjtime, | ||
424 | .gettime = ptp_gianfar_gettime, | ||
425 | .settime = ptp_gianfar_settime, | ||
426 | .enable = ptp_gianfar_enable, | ||
427 | }; | ||
428 | |||
429 | /* OF device tree */ | ||
430 | |||
431 | static int get_of_u32(struct device_node *node, char *str, u32 *val) | ||
432 | { | ||
433 | int plen; | ||
434 | const u32 *prop = of_get_property(node, str, &plen); | ||
435 | |||
436 | if (!prop || plen != sizeof(*prop)) | ||
437 | return -1; | ||
438 | *val = *prop; | ||
439 | return 0; | ||
440 | } | ||
441 | |||
442 | static int gianfar_ptp_probe(struct platform_device *dev) | ||
443 | { | ||
444 | struct device_node *node = dev->dev.of_node; | ||
445 | struct etsects *etsects; | ||
446 | struct timespec now; | ||
447 | int err = -ENOMEM; | ||
448 | u32 tmr_ctrl; | ||
449 | unsigned long flags; | ||
450 | |||
451 | etsects = kzalloc(sizeof(*etsects), GFP_KERNEL); | ||
452 | if (!etsects) | ||
453 | goto no_memory; | ||
454 | |||
455 | err = -ENODEV; | ||
456 | |||
457 | etsects->caps = ptp_gianfar_caps; | ||
458 | etsects->cksel = DEFAULT_CKSEL; | ||
459 | |||
460 | if (get_of_u32(node, "fsl,tclk-period", &etsects->tclk_period) || | ||
461 | get_of_u32(node, "fsl,tmr-prsc", &etsects->tmr_prsc) || | ||
462 | get_of_u32(node, "fsl,tmr-add", &etsects->tmr_add) || | ||
463 | get_of_u32(node, "fsl,tmr-fiper1", &etsects->tmr_fiper1) || | ||
464 | get_of_u32(node, "fsl,tmr-fiper2", &etsects->tmr_fiper2) || | ||
465 | get_of_u32(node, "fsl,max-adj", &etsects->caps.max_adj)) { | ||
466 | pr_err("device tree node missing required elements\n"); | ||
467 | goto no_node; | ||
468 | } | ||
469 | |||
470 | etsects->irq = platform_get_irq(dev, 0); | ||
471 | |||
472 | if (etsects->irq == NO_IRQ) { | ||
473 | pr_err("irq not in device tree\n"); | ||
474 | goto no_node; | ||
475 | } | ||
476 | if (request_irq(etsects->irq, isr, 0, DRIVER, etsects)) { | ||
477 | pr_err("request_irq failed\n"); | ||
478 | goto no_node; | ||
479 | } | ||
480 | |||
481 | etsects->rsrc = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
482 | if (!etsects->rsrc) { | ||
483 | pr_err("no resource\n"); | ||
484 | goto no_resource; | ||
485 | } | ||
486 | if (request_resource(&ioport_resource, etsects->rsrc)) { | ||
487 | pr_err("resource busy\n"); | ||
488 | goto no_resource; | ||
489 | } | ||
490 | |||
491 | spin_lock_init(&etsects->lock); | ||
492 | |||
493 | etsects->regs = ioremap(etsects->rsrc->start, | ||
494 | 1 + etsects->rsrc->end - etsects->rsrc->start); | ||
495 | if (!etsects->regs) { | ||
496 | pr_err("ioremap ptp registers failed\n"); | ||
497 | goto no_ioremap; | ||
498 | } | ||
499 | getnstimeofday(&now); | ||
500 | ptp_gianfar_settime(&etsects->caps, &now); | ||
501 | |||
502 | tmr_ctrl = | ||
503 | (etsects->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT | | ||
504 | (etsects->cksel & CKSEL_MASK) << CKSEL_SHIFT; | ||
505 | |||
506 | spin_lock_irqsave(&etsects->lock, flags); | ||
507 | |||
508 | gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl); | ||
509 | gfar_write(&etsects->regs->tmr_add, etsects->tmr_add); | ||
510 | gfar_write(&etsects->regs->tmr_prsc, etsects->tmr_prsc); | ||
511 | gfar_write(&etsects->regs->tmr_fiper1, etsects->tmr_fiper1); | ||
512 | gfar_write(&etsects->regs->tmr_fiper2, etsects->tmr_fiper2); | ||
513 | set_alarm(etsects); | ||
514 | gfar_write(&etsects->regs->tmr_ctrl, tmr_ctrl|FS|RTPE|TE); | ||
515 | |||
516 | spin_unlock_irqrestore(&etsects->lock, flags); | ||
517 | |||
518 | etsects->clock = ptp_clock_register(&etsects->caps); | ||
519 | if (IS_ERR(etsects->clock)) { | ||
520 | err = PTR_ERR(etsects->clock); | ||
521 | goto no_clock; | ||
522 | } | ||
523 | |||
524 | dev_set_drvdata(&dev->dev, etsects); | ||
525 | |||
526 | return 0; | ||
527 | |||
528 | no_clock: | ||
529 | no_ioremap: | ||
530 | release_resource(etsects->rsrc); | ||
531 | no_resource: | ||
532 | free_irq(etsects->irq, etsects); | ||
533 | no_node: | ||
534 | kfree(etsects); | ||
535 | no_memory: | ||
536 | return err; | ||
537 | } | ||
538 | |||
539 | static int gianfar_ptp_remove(struct platform_device *dev) | ||
540 | { | ||
541 | struct etsects *etsects = dev_get_drvdata(&dev->dev); | ||
542 | |||
543 | gfar_write(&etsects->regs->tmr_temask, 0); | ||
544 | gfar_write(&etsects->regs->tmr_ctrl, 0); | ||
545 | |||
546 | ptp_clock_unregister(etsects->clock); | ||
547 | iounmap(etsects->regs); | ||
548 | release_resource(etsects->rsrc); | ||
549 | free_irq(etsects->irq, etsects); | ||
550 | kfree(etsects); | ||
551 | |||
552 | return 0; | ||
553 | } | ||
554 | |||
555 | static struct of_device_id match_table[] = { | ||
556 | { .compatible = "fsl,etsec-ptp" }, | ||
557 | {}, | ||
558 | }; | ||
559 | |||
560 | static struct platform_driver gianfar_ptp_driver = { | ||
561 | .driver = { | ||
562 | .name = "gianfar_ptp", | ||
563 | .of_match_table = match_table, | ||
564 | .owner = THIS_MODULE, | ||
565 | }, | ||
566 | .probe = gianfar_ptp_probe, | ||
567 | .remove = gianfar_ptp_remove, | ||
568 | }; | ||
569 | |||
570 | /* module operations */ | ||
571 | |||
572 | static int __init ptp_gianfar_init(void) | ||
573 | { | ||
574 | return platform_driver_register(&gianfar_ptp_driver); | ||
575 | } | ||
576 | |||
577 | module_init(ptp_gianfar_init); | ||
578 | |||
579 | static void __exit ptp_gianfar_exit(void) | ||
580 | { | ||
581 | platform_driver_unregister(&gianfar_ptp_driver); | ||
582 | } | ||
583 | |||
584 | module_exit(ptp_gianfar_exit); | ||
585 | |||
586 | MODULE_AUTHOR("Richard Cochran <richard.cochran@omicron.at>"); | ||
587 | MODULE_DESCRIPTION("PTP clock using the eTSEC"); | ||
588 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c index a3c0dc9d8b9..9537aaa50c2 100644 --- a/drivers/net/hamradio/baycom_epp.c +++ b/drivers/net/hamradio/baycom_epp.c | |||
@@ -69,7 +69,7 @@ static const char paranoia_str[] = KERN_ERR | |||
69 | 69 | ||
70 | static const char bc_drvname[] = "baycom_epp"; | 70 | static const char bc_drvname[] = "baycom_epp"; |
71 | static const char bc_drvinfo[] = KERN_INFO "baycom_epp: (C) 1998-2000 Thomas Sailer, HB9JNX/AE4WA\n" | 71 | static const char bc_drvinfo[] = KERN_INFO "baycom_epp: (C) 1998-2000 Thomas Sailer, HB9JNX/AE4WA\n" |
72 | "baycom_epp: version 0.7 compiled " __TIME__ " " __DATE__ "\n"; | 72 | "baycom_epp: version 0.7\n"; |
73 | 73 | ||
74 | /* --------------------------------------------------------------------- */ | 74 | /* --------------------------------------------------------------------- */ |
75 | 75 | ||
diff --git a/drivers/net/hamradio/baycom_par.c b/drivers/net/hamradio/baycom_par.c index 5f5af9a606f..279d2296290 100644 --- a/drivers/net/hamradio/baycom_par.c +++ b/drivers/net/hamradio/baycom_par.c | |||
@@ -102,7 +102,7 @@ | |||
102 | 102 | ||
103 | static const char bc_drvname[] = "baycom_par"; | 103 | static const char bc_drvname[] = "baycom_par"; |
104 | static const char bc_drvinfo[] = KERN_INFO "baycom_par: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA\n" | 104 | static const char bc_drvinfo[] = KERN_INFO "baycom_par: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA\n" |
105 | "baycom_par: version 0.9 compiled " __TIME__ " " __DATE__ "\n"; | 105 | "baycom_par: version 0.9\n"; |
106 | 106 | ||
107 | /* --------------------------------------------------------------------- */ | 107 | /* --------------------------------------------------------------------- */ |
108 | 108 | ||
diff --git a/drivers/net/hamradio/baycom_ser_fdx.c b/drivers/net/hamradio/baycom_ser_fdx.c index 3e25f10cabd..99cdce33df8 100644 --- a/drivers/net/hamradio/baycom_ser_fdx.c +++ b/drivers/net/hamradio/baycom_ser_fdx.c | |||
@@ -92,7 +92,7 @@ | |||
92 | 92 | ||
93 | static const char bc_drvname[] = "baycom_ser_fdx"; | 93 | static const char bc_drvname[] = "baycom_ser_fdx"; |
94 | static const char bc_drvinfo[] = KERN_INFO "baycom_ser_fdx: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA\n" | 94 | static const char bc_drvinfo[] = KERN_INFO "baycom_ser_fdx: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA\n" |
95 | "baycom_ser_fdx: version 0.10 compiled " __TIME__ " " __DATE__ "\n"; | 95 | "baycom_ser_fdx: version 0.10\n"; |
96 | 96 | ||
97 | /* --------------------------------------------------------------------- */ | 97 | /* --------------------------------------------------------------------- */ |
98 | 98 | ||
diff --git a/drivers/net/hamradio/baycom_ser_hdx.c b/drivers/net/hamradio/baycom_ser_hdx.c index 1686f6dcbbc..d92fe6ca788 100644 --- a/drivers/net/hamradio/baycom_ser_hdx.c +++ b/drivers/net/hamradio/baycom_ser_hdx.c | |||
@@ -80,7 +80,7 @@ | |||
80 | 80 | ||
81 | static const char bc_drvname[] = "baycom_ser_hdx"; | 81 | static const char bc_drvname[] = "baycom_ser_hdx"; |
82 | static const char bc_drvinfo[] = KERN_INFO "baycom_ser_hdx: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA\n" | 82 | static const char bc_drvinfo[] = KERN_INFO "baycom_ser_hdx: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA\n" |
83 | "baycom_ser_hdx: version 0.10 compiled " __TIME__ " " __DATE__ "\n"; | 83 | "baycom_ser_hdx: version 0.10\n"; |
84 | 84 | ||
85 | /* --------------------------------------------------------------------- */ | 85 | /* --------------------------------------------------------------------- */ |
86 | 86 | ||
diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c index 5b37579e84b..a4a3516b6bb 100644 --- a/drivers/net/hamradio/hdlcdrv.c +++ b/drivers/net/hamradio/hdlcdrv.c | |||
@@ -749,7 +749,7 @@ EXPORT_SYMBOL(hdlcdrv_unregister); | |||
749 | static int __init hdlcdrv_init_driver(void) | 749 | static int __init hdlcdrv_init_driver(void) |
750 | { | 750 | { |
751 | printk(KERN_INFO "hdlcdrv: (C) 1996-2000 Thomas Sailer HB9JNX/AE4WA\n"); | 751 | printk(KERN_INFO "hdlcdrv: (C) 1996-2000 Thomas Sailer HB9JNX/AE4WA\n"); |
752 | printk(KERN_INFO "hdlcdrv: version 0.8 compiled " __TIME__ " " __DATE__ "\n"); | 752 | printk(KERN_INFO "hdlcdrv: version 0.8\n"); |
753 | return 0; | 753 | return 0; |
754 | } | 754 | } |
755 | 755 | ||
diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index c52a1df5d92..8e10d2f6a5a 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c | |||
@@ -188,14 +188,14 @@ struct hp100_private { | |||
188 | * variables | 188 | * variables |
189 | */ | 189 | */ |
190 | #ifdef CONFIG_ISA | 190 | #ifdef CONFIG_ISA |
191 | static const char *const hp100_isa_tbl[] __devinitconst = { | 191 | static const char *hp100_isa_tbl[] = { |
192 | "HWPF150", /* HP J2573 rev A */ | 192 | "HWPF150", /* HP J2573 rev A */ |
193 | "HWP1950", /* HP J2573 */ | 193 | "HWP1950", /* HP J2573 */ |
194 | }; | 194 | }; |
195 | #endif | 195 | #endif |
196 | 196 | ||
197 | #ifdef CONFIG_EISA | 197 | #ifdef CONFIG_EISA |
198 | static const struct eisa_device_id hp100_eisa_tbl[] __devinitconst = { | 198 | static struct eisa_device_id hp100_eisa_tbl[] = { |
199 | { "HWPF180" }, /* HP J2577 rev A */ | 199 | { "HWPF180" }, /* HP J2577 rev A */ |
200 | { "HWP1920" }, /* HP 27248B */ | 200 | { "HWP1920" }, /* HP 27248B */ |
201 | { "HWP1940" }, /* HP J2577 */ | 201 | { "HWP1940" }, /* HP J2577 */ |
@@ -336,7 +336,7 @@ static __devinit const char *hp100_read_id(int ioaddr) | |||
336 | } | 336 | } |
337 | 337 | ||
338 | #ifdef CONFIG_ISA | 338 | #ifdef CONFIG_ISA |
339 | static __devinit int hp100_isa_probe1(struct net_device *dev, int ioaddr) | 339 | static __init int hp100_isa_probe1(struct net_device *dev, int ioaddr) |
340 | { | 340 | { |
341 | const char *sig; | 341 | const char *sig; |
342 | int i; | 342 | int i; |
@@ -372,7 +372,7 @@ static __devinit int hp100_isa_probe1(struct net_device *dev, int ioaddr) | |||
372 | * EISA and PCI are handled by device infrastructure. | 372 | * EISA and PCI are handled by device infrastructure. |
373 | */ | 373 | */ |
374 | 374 | ||
375 | static int __devinit hp100_isa_probe(struct net_device *dev, int addr) | 375 | static int __init hp100_isa_probe(struct net_device *dev, int addr) |
376 | { | 376 | { |
377 | int err = -ENODEV; | 377 | int err = -ENODEV; |
378 | 378 | ||
@@ -396,7 +396,7 @@ static int __devinit hp100_isa_probe(struct net_device *dev, int addr) | |||
396 | #endif /* CONFIG_ISA */ | 396 | #endif /* CONFIG_ISA */ |
397 | 397 | ||
398 | #if !defined(MODULE) && defined(CONFIG_ISA) | 398 | #if !defined(MODULE) && defined(CONFIG_ISA) |
399 | struct net_device * __devinit hp100_probe(int unit) | 399 | struct net_device * __init hp100_probe(int unit) |
400 | { | 400 | { |
401 | struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); | 401 | struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); |
402 | int err; | 402 | int err; |
@@ -2843,7 +2843,7 @@ static void cleanup_dev(struct net_device *d) | |||
2843 | } | 2843 | } |
2844 | 2844 | ||
2845 | #ifdef CONFIG_EISA | 2845 | #ifdef CONFIG_EISA |
2846 | static int __devinit hp100_eisa_probe (struct device *gendev) | 2846 | static int __init hp100_eisa_probe (struct device *gendev) |
2847 | { | 2847 | { |
2848 | struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); | 2848 | struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); |
2849 | struct eisa_device *edev = to_eisa_device(gendev); | 2849 | struct eisa_device *edev = to_eisa_device(gendev); |
diff --git a/drivers/net/hplance.c b/drivers/net/hplance.c index b6060f7538d..a900d5bf294 100644 --- a/drivers/net/hplance.c +++ b/drivers/net/hplance.c | |||
@@ -135,7 +135,7 @@ static void __devexit hplance_remove_one(struct dio_dev *d) | |||
135 | } | 135 | } |
136 | 136 | ||
137 | /* Initialise a single lance board at the given DIO device */ | 137 | /* Initialise a single lance board at the given DIO device */ |
138 | static void __init hplance_init(struct net_device *dev, struct dio_dev *d) | 138 | static void __devinit hplance_init(struct net_device *dev, struct dio_dev *d) |
139 | { | 139 | { |
140 | unsigned long va = (d->resource.start + DIO_VIRADDRBASE); | 140 | unsigned long va = (d->resource.start + DIO_VIRADDRBASE); |
141 | struct hplance_private *lp; | 141 | struct hplance_private *lp; |
diff --git a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c index 136d7544cc3..a7d6cad3295 100644 --- a/drivers/net/ibmlana.c +++ b/drivers/net/ibmlana.c | |||
@@ -895,12 +895,12 @@ static int ibmlana_irq; | |||
895 | static int ibmlana_io; | 895 | static int ibmlana_io; |
896 | static int startslot; /* counts through slots when probing multiple devices */ | 896 | static int startslot; /* counts through slots when probing multiple devices */ |
897 | 897 | ||
898 | static const short ibmlana_adapter_ids[] __devinitconst = { | 898 | static short ibmlana_adapter_ids[] __initdata = { |
899 | IBM_LANA_ID, | 899 | IBM_LANA_ID, |
900 | 0x0000 | 900 | 0x0000 |
901 | }; | 901 | }; |
902 | 902 | ||
903 | static const char *const ibmlana_adapter_names[] __devinitconst = { | 903 | static char *ibmlana_adapter_names[] __devinitdata = { |
904 | "IBM LAN Adapter/A", | 904 | "IBM LAN Adapter/A", |
905 | NULL | 905 | NULL |
906 | }; | 906 | }; |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 18fccf91363..2c28621eb30 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -2373,6 +2373,9 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) | |||
2373 | } | 2373 | } |
2374 | #endif /* CONFIG_PCI_IOV */ | 2374 | #endif /* CONFIG_PCI_IOV */ |
2375 | adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); | 2375 | adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); |
2376 | /* i350 cannot do RSS and SR-IOV at the same time */ | ||
2377 | if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count) | ||
2378 | adapter->rss_queues = 1; | ||
2376 | 2379 | ||
2377 | /* | 2380 | /* |
2378 | * if rss_queues > 4 or vfs are going to be allocated with rss_queues | 2381 | * if rss_queues > 4 or vfs are going to be allocated with rss_queues |
diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c index 96c95617195..32f07f868d8 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c | |||
@@ -915,7 +915,7 @@ static void ioc3_alloc_rings(struct net_device *dev) | |||
915 | 915 | ||
916 | skb = ioc3_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC); | 916 | skb = ioc3_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC); |
917 | if (!skb) { | 917 | if (!skb) { |
918 | show_free_areas(); | 918 | show_free_areas(0); |
919 | continue; | 919 | continue; |
920 | } | 920 | } |
921 | 921 | ||
diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index 69b5707db36..8800e1fe412 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c | |||
@@ -222,19 +222,19 @@ static void smsc_ircc_set_transceiver_for_speed(struct smsc_ircc_cb *self, u32 s | |||
222 | static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self); | 222 | static void smsc_ircc_sir_wait_hw_transmitter_finish(struct smsc_ircc_cb *self); |
223 | 223 | ||
224 | /* Probing */ | 224 | /* Probing */ |
225 | static int smsc_ircc_look_for_chips(void); | 225 | static int __init smsc_ircc_look_for_chips(void); |
226 | static const struct smsc_chip * smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type); | 226 | static const struct smsc_chip * __init smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type); |
227 | static int smsc_superio_flat(const struct smsc_chip *chips, unsigned short cfg_base, char *type); | 227 | static int __init smsc_superio_flat(const struct smsc_chip *chips, unsigned short cfg_base, char *type); |
228 | static int smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type); | 228 | static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned short cfg_base, char *type); |
229 | static int smsc_superio_fdc(unsigned short cfg_base); | 229 | static int __init smsc_superio_fdc(unsigned short cfg_base); |
230 | static int smsc_superio_lpc(unsigned short cfg_base); | 230 | static int __init smsc_superio_lpc(unsigned short cfg_base); |
231 | #ifdef CONFIG_PCI | 231 | #ifdef CONFIG_PCI |
232 | static int preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf); | 232 | static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf); |
233 | static int preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); | 233 | static int __init preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); |
234 | static void preconfigure_ali_port(struct pci_dev *dev, | 234 | static void __init preconfigure_ali_port(struct pci_dev *dev, |
235 | unsigned short port); | 235 | unsigned short port); |
236 | static int preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); | 236 | static int __init preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); |
237 | static int smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | 237 | static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, |
238 | unsigned short ircc_fir, | 238 | unsigned short ircc_fir, |
239 | unsigned short ircc_sir, | 239 | unsigned short ircc_sir, |
240 | unsigned char ircc_dma, | 240 | unsigned char ircc_dma, |
@@ -366,7 +366,7 @@ static inline void register_bank(int iobase, int bank) | |||
366 | } | 366 | } |
367 | 367 | ||
368 | /* PNP hotplug support */ | 368 | /* PNP hotplug support */ |
369 | static const struct pnp_device_id smsc_ircc_pnp_table[] __devinitconst = { | 369 | static const struct pnp_device_id smsc_ircc_pnp_table[] = { |
370 | { .id = "SMCf010", .driver_data = 0 }, | 370 | { .id = "SMCf010", .driver_data = 0 }, |
371 | /* and presumably others */ | 371 | /* and presumably others */ |
372 | { } | 372 | { } |
@@ -515,7 +515,7 @@ static const struct net_device_ops smsc_ircc_netdev_ops = { | |||
515 | * Try to open driver instance | 515 | * Try to open driver instance |
516 | * | 516 | * |
517 | */ | 517 | */ |
518 | static int __devinit smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq) | 518 | static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq) |
519 | { | 519 | { |
520 | struct smsc_ircc_cb *self; | 520 | struct smsc_ircc_cb *self; |
521 | struct net_device *dev; | 521 | struct net_device *dev; |
@@ -2273,7 +2273,7 @@ static int __init smsc_superio_paged(const struct smsc_chip *chips, unsigned sho | |||
2273 | } | 2273 | } |
2274 | 2274 | ||
2275 | 2275 | ||
2276 | static int __devinit smsc_access(unsigned short cfg_base, unsigned char reg) | 2276 | static int __init smsc_access(unsigned short cfg_base, unsigned char reg) |
2277 | { | 2277 | { |
2278 | IRDA_DEBUG(1, "%s\n", __func__); | 2278 | IRDA_DEBUG(1, "%s\n", __func__); |
2279 | 2279 | ||
@@ -2281,7 +2281,7 @@ static int __devinit smsc_access(unsigned short cfg_base, unsigned char reg) | |||
2281 | return inb(cfg_base) != reg ? -1 : 0; | 2281 | return inb(cfg_base) != reg ? -1 : 0; |
2282 | } | 2282 | } |
2283 | 2283 | ||
2284 | static const struct smsc_chip * __devinit smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type) | 2284 | static const struct smsc_chip * __init smsc_ircc_probe(unsigned short cfg_base, u8 reg, const struct smsc_chip *chip, char *type) |
2285 | { | 2285 | { |
2286 | u8 devid, xdevid, rev; | 2286 | u8 devid, xdevid, rev; |
2287 | 2287 | ||
@@ -2406,7 +2406,7 @@ static int __init smsc_superio_lpc(unsigned short cfg_base) | |||
2406 | #ifdef CONFIG_PCI | 2406 | #ifdef CONFIG_PCI |
2407 | #define PCIID_VENDOR_INTEL 0x8086 | 2407 | #define PCIID_VENDOR_INTEL 0x8086 |
2408 | #define PCIID_VENDOR_ALI 0x10b9 | 2408 | #define PCIID_VENDOR_ALI 0x10b9 |
2409 | static const struct smsc_ircc_subsystem_configuration subsystem_configurations[] __devinitconst = { | 2409 | static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = { |
2410 | /* | 2410 | /* |
2411 | * Subsystems needing entries: | 2411 | * Subsystems needing entries: |
2412 | * 0x10b9:0x1533 0x103c:0x0850 HP nx9010 family | 2412 | * 0x10b9:0x1533 0x103c:0x0850 HP nx9010 family |
@@ -2532,7 +2532,7 @@ static const struct smsc_ircc_subsystem_configuration subsystem_configurations[] | |||
2532 | * (FIR port, SIR port, FIR DMA, FIR IRQ) | 2532 | * (FIR port, SIR port, FIR DMA, FIR IRQ) |
2533 | * through the chip configuration port. | 2533 | * through the chip configuration port. |
2534 | */ | 2534 | */ |
2535 | static int __devinit preconfigure_smsc_chip(struct | 2535 | static int __init preconfigure_smsc_chip(struct |
2536 | smsc_ircc_subsystem_configuration | 2536 | smsc_ircc_subsystem_configuration |
2537 | *conf) | 2537 | *conf) |
2538 | { | 2538 | { |
@@ -2633,7 +2633,7 @@ static int __devinit preconfigure_smsc_chip(struct | |||
2633 | * or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge. | 2633 | * or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge. |
2634 | * They all work the same way! | 2634 | * They all work the same way! |
2635 | */ | 2635 | */ |
2636 | static int __devinit preconfigure_through_82801(struct pci_dev *dev, | 2636 | static int __init preconfigure_through_82801(struct pci_dev *dev, |
2637 | struct | 2637 | struct |
2638 | smsc_ircc_subsystem_configuration | 2638 | smsc_ircc_subsystem_configuration |
2639 | *conf) | 2639 | *conf) |
@@ -2786,7 +2786,7 @@ static int __devinit preconfigure_through_82801(struct pci_dev *dev, | |||
2786 | * This is based on reverse-engineering since ALi does not | 2786 | * This is based on reverse-engineering since ALi does not |
2787 | * provide any data sheet for the 1533 chip. | 2787 | * provide any data sheet for the 1533 chip. |
2788 | */ | 2788 | */ |
2789 | static void __devinit preconfigure_ali_port(struct pci_dev *dev, | 2789 | static void __init preconfigure_ali_port(struct pci_dev *dev, |
2790 | unsigned short port) | 2790 | unsigned short port) |
2791 | { | 2791 | { |
2792 | unsigned char reg; | 2792 | unsigned char reg; |
@@ -2824,7 +2824,7 @@ static void __devinit preconfigure_ali_port(struct pci_dev *dev, | |||
2824 | IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port); | 2824 | IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port); |
2825 | } | 2825 | } |
2826 | 2826 | ||
2827 | static int __devinit preconfigure_through_ali(struct pci_dev *dev, | 2827 | static int __init preconfigure_through_ali(struct pci_dev *dev, |
2828 | struct | 2828 | struct |
2829 | smsc_ircc_subsystem_configuration | 2829 | smsc_ircc_subsystem_configuration |
2830 | *conf) | 2830 | *conf) |
@@ -2837,7 +2837,7 @@ static int __devinit preconfigure_through_ali(struct pci_dev *dev, | |||
2837 | return preconfigure_smsc_chip(conf); | 2837 | return preconfigure_smsc_chip(conf); |
2838 | } | 2838 | } |
2839 | 2839 | ||
2840 | static int __devinit smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | 2840 | static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, |
2841 | unsigned short ircc_fir, | 2841 | unsigned short ircc_fir, |
2842 | unsigned short ircc_sir, | 2842 | unsigned short ircc_sir, |
2843 | unsigned char ircc_dma, | 2843 | unsigned char ircc_dma, |
@@ -2849,7 +2849,7 @@ static int __devinit smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | |||
2849 | int ret = 0; | 2849 | int ret = 0; |
2850 | 2850 | ||
2851 | for_each_pci_dev(dev) { | 2851 | for_each_pci_dev(dev) { |
2852 | const struct smsc_ircc_subsystem_configuration *conf; | 2852 | struct smsc_ircc_subsystem_configuration *conf; |
2853 | 2853 | ||
2854 | /* | 2854 | /* |
2855 | * Cache the subsystem vendor/device: | 2855 | * Cache the subsystem vendor/device: |
diff --git a/drivers/net/ks8842.c b/drivers/net/ks8842.c index f0d8346d0fa..fc12ac0d9f2 100644 --- a/drivers/net/ks8842.c +++ b/drivers/net/ks8842.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
29 | #include <linux/mfd/core.h> | ||
30 | #include <linux/netdevice.h> | 29 | #include <linux/netdevice.h> |
31 | #include <linux/etherdevice.h> | 30 | #include <linux/etherdevice.h> |
32 | #include <linux/ethtool.h> | 31 | #include <linux/ethtool.h> |
@@ -662,7 +661,7 @@ static void ks8842_rx_frame(struct net_device *netdev, | |||
662 | 661 | ||
663 | /* check the status */ | 662 | /* check the status */ |
664 | if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) { | 663 | if ((status & RXSR_VALID) && !(status & RXSR_ERROR)) { |
665 | struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len); | 664 | struct sk_buff *skb = netdev_alloc_skb_ip_align(netdev, len + 3); |
666 | 665 | ||
667 | if (skb) { | 666 | if (skb) { |
668 | 667 | ||
@@ -1146,7 +1145,7 @@ static int __devinit ks8842_probe(struct platform_device *pdev) | |||
1146 | struct resource *iomem; | 1145 | struct resource *iomem; |
1147 | struct net_device *netdev; | 1146 | struct net_device *netdev; |
1148 | struct ks8842_adapter *adapter; | 1147 | struct ks8842_adapter *adapter; |
1149 | struct ks8842_platform_data *pdata = mfd_get_data(pdev); | 1148 | struct ks8842_platform_data *pdata = pdev->dev.platform_data; |
1150 | u16 id; | 1149 | u16 id; |
1151 | unsigned i; | 1150 | unsigned i; |
1152 | 1151 | ||
diff --git a/drivers/net/ne3210.c b/drivers/net/ne3210.c index e8984b0ca52..243ed2aee88 100644 --- a/drivers/net/ne3210.c +++ b/drivers/net/ne3210.c | |||
@@ -80,20 +80,17 @@ static void ne3210_block_output(struct net_device *dev, int count, const unsigne | |||
80 | 80 | ||
81 | #define NE3210_DEBUG 0x0 | 81 | #define NE3210_DEBUG 0x0 |
82 | 82 | ||
83 | static const unsigned char irq_map[] __devinitconst = | 83 | static unsigned char irq_map[] __initdata = {15, 12, 11, 10, 9, 7, 5, 3}; |
84 | { 15, 12, 11, 10, 9, 7, 5, 3 }; | 84 | static unsigned int shmem_map[] __initdata = {0xff0, 0xfe0, 0xfff0, 0xd8, 0xffe0, 0xffc0, 0xd0, 0x0}; |
85 | static const unsigned int shmem_map[] __devinitconst = | 85 | static const char *ifmap[] __initdata = {"UTP", "?", "BNC", "AUI"}; |
86 | { 0xff0, 0xfe0, 0xfff0, 0xd8, 0xffe0, 0xffc0, 0xd0, 0x0 }; | 86 | static int ifmap_val[] __initdata = { |
87 | static const char *const ifmap[] __devinitconst = | ||
88 | { "UTP", "?", "BNC", "AUI" }; | ||
89 | static const int ifmap_val[] __devinitconst = { | ||
90 | IF_PORT_10BASET, | 87 | IF_PORT_10BASET, |
91 | IF_PORT_UNKNOWN, | 88 | IF_PORT_UNKNOWN, |
92 | IF_PORT_10BASE2, | 89 | IF_PORT_10BASE2, |
93 | IF_PORT_AUI, | 90 | IF_PORT_AUI, |
94 | }; | 91 | }; |
95 | 92 | ||
96 | static int __devinit ne3210_eisa_probe (struct device *device) | 93 | static int __init ne3210_eisa_probe (struct device *device) |
97 | { | 94 | { |
98 | unsigned long ioaddr, phys_mem; | 95 | unsigned long ioaddr, phys_mem; |
99 | int i, retval, port_index; | 96 | int i, retval, port_index; |
@@ -316,7 +313,7 @@ static void ne3210_block_output(struct net_device *dev, int count, | |||
316 | memcpy_toio(shmem, buf, count); | 313 | memcpy_toio(shmem, buf, count); |
317 | } | 314 | } |
318 | 315 | ||
319 | static const struct eisa_device_id ne3210_ids[] __devinitconst = { | 316 | static struct eisa_device_id ne3210_ids[] = { |
320 | { "EGL0101" }, | 317 | { "EGL0101" }, |
321 | { "NVL1801" }, | 318 | { "NVL1801" }, |
322 | { "" }, | 319 | { "" }, |
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c index 81ac330f931..34c5e1cbf65 100644 --- a/drivers/net/pcmcia/3c574_cs.c +++ b/drivers/net/pcmcia/3c574_cs.c | |||
@@ -1150,7 +1150,7 @@ static int el3_close(struct net_device *dev) | |||
1150 | return 0; | 1150 | return 0; |
1151 | } | 1151 | } |
1152 | 1152 | ||
1153 | static struct pcmcia_device_id tc574_ids[] = { | 1153 | static const struct pcmcia_device_id tc574_ids[] = { |
1154 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0574), | 1154 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0574), |
1155 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0556, "cis/3CCFEM556.cis"), | 1155 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0556, "cis/3CCFEM556.cis"), |
1156 | PCMCIA_DEVICE_NULL, | 1156 | PCMCIA_DEVICE_NULL, |
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index 79b9ca0dbdb..4a1a3580980 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c | |||
@@ -908,7 +908,7 @@ static int el3_close(struct net_device *dev) | |||
908 | return 0; | 908 | return 0; |
909 | } | 909 | } |
910 | 910 | ||
911 | static struct pcmcia_device_id tc589_ids[] = { | 911 | static const struct pcmcia_device_id tc589_ids[] = { |
912 | PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0101, 0x0562), | 912 | PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0101, 0x0562), |
913 | PCMCIA_MFC_DEVICE_PROD_ID1(0, "Motorola MARQUIS", 0xf03e4e77), | 913 | PCMCIA_MFC_DEVICE_PROD_ID1(0, "Motorola MARQUIS", 0xf03e4e77), |
914 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0589), | 914 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0589), |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 3077d72e822..9953db71196 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
@@ -687,7 +687,7 @@ static void block_output(struct net_device *dev, int count, | |||
687 | outsw(nic_base + AXNET_DATAPORT, buf, count>>1); | 687 | outsw(nic_base + AXNET_DATAPORT, buf, count>>1); |
688 | } | 688 | } |
689 | 689 | ||
690 | static struct pcmcia_device_id axnet_ids[] = { | 690 | static const struct pcmcia_device_id axnet_ids[] = { |
691 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081), | 691 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081), |
692 | PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301), | 692 | PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301), |
693 | PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328), | 693 | PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328), |
diff --git a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c index 27bfad76fc4..980e65c1493 100644 --- a/drivers/net/pcmcia/com20020_cs.c +++ b/drivers/net/pcmcia/com20020_cs.c | |||
@@ -316,7 +316,7 @@ static int com20020_resume(struct pcmcia_device *link) | |||
316 | return 0; | 316 | return 0; |
317 | } | 317 | } |
318 | 318 | ||
319 | static struct pcmcia_device_id com20020_ids[] = { | 319 | static const struct pcmcia_device_id com20020_ids[] = { |
320 | PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.", | 320 | PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.", |
321 | "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf), | 321 | "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf), |
322 | PCMCIA_DEVICE_PROD_ID12("SoHard AG", | 322 | PCMCIA_DEVICE_PROD_ID12("SoHard AG", |
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index 530ab5a10bd..723815e7a99 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c | |||
@@ -667,7 +667,7 @@ static int fmvj18x_resume(struct pcmcia_device *link) | |||
667 | 667 | ||
668 | /*====================================================================*/ | 668 | /*====================================================================*/ |
669 | 669 | ||
670 | static struct pcmcia_device_id fmvj18x_ids[] = { | 670 | static const struct pcmcia_device_id fmvj18x_ids[] = { |
671 | PCMCIA_DEVICE_MANF_CARD(0x0004, 0x0004), | 671 | PCMCIA_DEVICE_MANF_CARD(0x0004, 0x0004), |
672 | PCMCIA_DEVICE_PROD_ID12("EAGLE Technology", "NE200 ETHERNET LAN MBH10302 04", 0x528c88c4, 0x74f91e59), | 672 | PCMCIA_DEVICE_PROD_ID12("EAGLE Technology", "NE200 ETHERNET LAN MBH10302 04", 0x528c88c4, 0x74f91e59), |
673 | PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922), | 673 | PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922), |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index 15d57f5b6f2..6006d5488fb 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
@@ -340,7 +340,7 @@ static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase) | |||
340 | outb(0x40, dev->base_addr); | 340 | outb(0x40, dev->base_addr); |
341 | } | 341 | } |
342 | 342 | ||
343 | static struct pcmcia_device_id ibmtr_ids[] = { | 343 | static const struct pcmcia_device_id ibmtr_ids[] = { |
344 | PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e), | 344 | PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e), |
345 | PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47), | 345 | PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47), |
346 | PCMCIA_DEVICE_NULL, | 346 | PCMCIA_DEVICE_NULL, |
diff --git a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c index 76683d97d83..9d70b659522 100644 --- a/drivers/net/pcmcia/nmclan_cs.c +++ b/drivers/net/pcmcia/nmclan_cs.c | |||
@@ -1494,7 +1494,7 @@ static void set_multicast_list(struct net_device *dev) | |||
1494 | 1494 | ||
1495 | } /* set_multicast_list */ | 1495 | } /* set_multicast_list */ |
1496 | 1496 | ||
1497 | static struct pcmcia_device_id nmclan_ids[] = { | 1497 | static const struct pcmcia_device_id nmclan_ids[] = { |
1498 | PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Ethernet", 0x085a850b, 0x00b2e941), | 1498 | PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Ethernet", 0x085a850b, 0x00b2e941), |
1499 | PCMCIA_DEVICE_PROD_ID12("Portable Add-ons", "Ethernet+", 0xebf1d60, 0xad673aaf), | 1499 | PCMCIA_DEVICE_PROD_ID12("Portable Add-ons", "Ethernet+", 0xebf1d60, 0xad673aaf), |
1500 | PCMCIA_DEVICE_NULL, | 1500 | PCMCIA_DEVICE_NULL, |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index e953793a33f..b4fd7c3ed07 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
@@ -1463,7 +1463,7 @@ failed: | |||
1463 | 1463 | ||
1464 | /*====================================================================*/ | 1464 | /*====================================================================*/ |
1465 | 1465 | ||
1466 | static struct pcmcia_device_id pcnet_ids[] = { | 1466 | static const struct pcmcia_device_id pcnet_ids[] = { |
1467 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0057, 0x0021), | 1467 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0057, 0x0021), |
1468 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0104, 0x000a), | 1468 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0104, 0x000a), |
1469 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0xea15), | 1469 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0xea15), |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 288e4f1317e..1cd9394c335 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
@@ -2014,7 +2014,7 @@ static int smc_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) | |||
2014 | return rc; | 2014 | return rc; |
2015 | } | 2015 | } |
2016 | 2016 | ||
2017 | static struct pcmcia_device_id smc91c92_ids[] = { | 2017 | static const struct pcmcia_device_id smc91c92_ids[] = { |
2018 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0109, 0x0501), | 2018 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0109, 0x0501), |
2019 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0140, 0x000a), | 2019 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0140, 0x000a), |
2020 | PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63), | 2020 | PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63), |
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index a46b7fd6c0f..e33b190d716 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c | |||
@@ -1738,7 +1738,7 @@ do_stop(struct net_device *dev) | |||
1738 | return 0; | 1738 | return 0; |
1739 | } | 1739 | } |
1740 | 1740 | ||
1741 | static struct pcmcia_device_id xirc2ps_ids[] = { | 1741 | static const struct pcmcia_device_id xirc2ps_ids[] = { |
1742 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0089, 0x110a), | 1742 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0089, 0x110a), |
1743 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0138, 0x110a), | 1743 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0138, 0x110a), |
1744 | PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea), | 1744 | PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea), |
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 392a6c4b72e..a70244306c9 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig | |||
@@ -58,6 +58,7 @@ config BROADCOM_PHY | |||
58 | 58 | ||
59 | config BCM63XX_PHY | 59 | config BCM63XX_PHY |
60 | tristate "Drivers for Broadcom 63xx SOCs internal PHY" | 60 | tristate "Drivers for Broadcom 63xx SOCs internal PHY" |
61 | depends on BCM63XX | ||
61 | ---help--- | 62 | ---help--- |
62 | Currently supports the 6348 and 6358 PHYs. | 63 | Currently supports the 6348 and 6358 PHYs. |
63 | 64 | ||
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 13bebab65d0..2333215bbb3 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile | |||
@@ -19,6 +19,7 @@ obj-$(CONFIG_FIXED_PHY) += fixed.o | |||
19 | obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o | 19 | obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o |
20 | obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o | 20 | obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o |
21 | obj-$(CONFIG_NATIONAL_PHY) += national.o | 21 | obj-$(CONFIG_NATIONAL_PHY) += national.o |
22 | obj-$(CONFIG_DP83640_PHY) += dp83640.o | ||
22 | obj-$(CONFIG_STE10XP) += ste10Xp.o | 23 | obj-$(CONFIG_STE10XP) += ste10Xp.o |
23 | obj-$(CONFIG_MICREL_PHY) += micrel.o | 24 | obj-$(CONFIG_MICREL_PHY) += micrel.o |
24 | obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o | 25 | obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o |
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c new file mode 100644 index 00000000000..2cd8dc5847b --- /dev/null +++ b/drivers/net/phy/dp83640.c | |||
@@ -0,0 +1,1110 @@ | |||
1 | /* | ||
2 | * Driver for the National Semiconductor DP83640 PHYTER | ||
3 | * | ||
4 | * Copyright (C) 2010 OMICRON electronics GmbH | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | #include <linux/ethtool.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/list.h> | ||
23 | #include <linux/mii.h> | ||
24 | #include <linux/module.h> | ||
25 | #include <linux/net_tstamp.h> | ||
26 | #include <linux/netdevice.h> | ||
27 | #include <linux/phy.h> | ||
28 | #include <linux/ptp_classify.h> | ||
29 | #include <linux/ptp_clock_kernel.h> | ||
30 | |||
31 | #include "dp83640_reg.h" | ||
32 | |||
33 | #define DP83640_PHY_ID 0x20005ce1 | ||
34 | #define PAGESEL 0x13 | ||
35 | #define LAYER4 0x02 | ||
36 | #define LAYER2 0x01 | ||
37 | #define MAX_RXTS 4 | ||
38 | #define MAX_TXTS 4 | ||
39 | #define N_EXT_TS 1 | ||
40 | #define PSF_PTPVER 2 | ||
41 | #define PSF_EVNT 0x4000 | ||
42 | #define PSF_RX 0x2000 | ||
43 | #define PSF_TX 0x1000 | ||
44 | #define EXT_EVENT 1 | ||
45 | #define EXT_GPIO 1 | ||
46 | #define CAL_EVENT 2 | ||
47 | #define CAL_GPIO 9 | ||
48 | #define CAL_TRIGGER 2 | ||
49 | |||
50 | /* phyter seems to miss the mark by 16 ns */ | ||
51 | #define ADJTIME_FIX 16 | ||
52 | |||
53 | #if defined(__BIG_ENDIAN) | ||
54 | #define ENDIAN_FLAG 0 | ||
55 | #elif defined(__LITTLE_ENDIAN) | ||
56 | #define ENDIAN_FLAG PSF_ENDIAN | ||
57 | #endif | ||
58 | |||
59 | #define SKB_PTP_TYPE(__skb) (*(unsigned int *)((__skb)->cb)) | ||
60 | |||
61 | struct phy_rxts { | ||
62 | u16 ns_lo; /* ns[15:0] */ | ||
63 | u16 ns_hi; /* overflow[1:0], ns[29:16] */ | ||
64 | u16 sec_lo; /* sec[15:0] */ | ||
65 | u16 sec_hi; /* sec[31:16] */ | ||
66 | u16 seqid; /* sequenceId[15:0] */ | ||
67 | u16 msgtype; /* messageType[3:0], hash[11:0] */ | ||
68 | }; | ||
69 | |||
70 | struct phy_txts { | ||
71 | u16 ns_lo; /* ns[15:0] */ | ||
72 | u16 ns_hi; /* overflow[1:0], ns[29:16] */ | ||
73 | u16 sec_lo; /* sec[15:0] */ | ||
74 | u16 sec_hi; /* sec[31:16] */ | ||
75 | }; | ||
76 | |||
77 | struct rxts { | ||
78 | struct list_head list; | ||
79 | unsigned long tmo; | ||
80 | u64 ns; | ||
81 | u16 seqid; | ||
82 | u8 msgtype; | ||
83 | u16 hash; | ||
84 | }; | ||
85 | |||
86 | struct dp83640_clock; | ||
87 | |||
88 | struct dp83640_private { | ||
89 | struct list_head list; | ||
90 | struct dp83640_clock *clock; | ||
91 | struct phy_device *phydev; | ||
92 | struct work_struct ts_work; | ||
93 | int hwts_tx_en; | ||
94 | int hwts_rx_en; | ||
95 | int layer; | ||
96 | int version; | ||
97 | /* remember state of cfg0 during calibration */ | ||
98 | int cfg0; | ||
99 | /* remember the last event time stamp */ | ||
100 | struct phy_txts edata; | ||
101 | /* list of rx timestamps */ | ||
102 | struct list_head rxts; | ||
103 | struct list_head rxpool; | ||
104 | struct rxts rx_pool_data[MAX_RXTS]; | ||
105 | /* protects above three fields from concurrent access */ | ||
106 | spinlock_t rx_lock; | ||
107 | /* queues of incoming and outgoing packets */ | ||
108 | struct sk_buff_head rx_queue; | ||
109 | struct sk_buff_head tx_queue; | ||
110 | }; | ||
111 | |||
112 | struct dp83640_clock { | ||
113 | /* keeps the instance in the 'phyter_clocks' list */ | ||
114 | struct list_head list; | ||
115 | /* we create one clock instance per MII bus */ | ||
116 | struct mii_bus *bus; | ||
117 | /* protects extended registers from concurrent access */ | ||
118 | struct mutex extreg_lock; | ||
119 | /* remembers which page was last selected */ | ||
120 | int page; | ||
121 | /* our advertised capabilities */ | ||
122 | struct ptp_clock_info caps; | ||
123 | /* protects the three fields below from concurrent access */ | ||
124 | struct mutex clock_lock; | ||
125 | /* the one phyter from which we shall read */ | ||
126 | struct dp83640_private *chosen; | ||
127 | /* list of the other attached phyters, not chosen */ | ||
128 | struct list_head phylist; | ||
129 | /* reference to our PTP hardware clock */ | ||
130 | struct ptp_clock *ptp_clock; | ||
131 | }; | ||
132 | |||
133 | /* globals */ | ||
134 | |||
135 | static int chosen_phy = -1; | ||
136 | static ushort cal_gpio = 4; | ||
137 | |||
138 | module_param(chosen_phy, int, 0444); | ||
139 | module_param(cal_gpio, ushort, 0444); | ||
140 | |||
141 | MODULE_PARM_DESC(chosen_phy, \ | ||
142 | "The address of the PHY to use for the ancillary clock features"); | ||
143 | MODULE_PARM_DESC(cal_gpio, \ | ||
144 | "Which GPIO line to use for synchronizing multiple PHYs"); | ||
145 | |||
146 | /* a list of clocks and a mutex to protect it */ | ||
147 | static LIST_HEAD(phyter_clocks); | ||
148 | static DEFINE_MUTEX(phyter_clocks_lock); | ||
149 | |||
150 | static void rx_timestamp_work(struct work_struct *work); | ||
151 | |||
152 | /* extended register access functions */ | ||
153 | |||
154 | #define BROADCAST_ADDR 31 | ||
155 | |||
156 | static inline int broadcast_write(struct mii_bus *bus, u32 regnum, u16 val) | ||
157 | { | ||
158 | return mdiobus_write(bus, BROADCAST_ADDR, regnum, val); | ||
159 | } | ||
160 | |||
161 | /* Caller must hold extreg_lock. */ | ||
162 | static int ext_read(struct phy_device *phydev, int page, u32 regnum) | ||
163 | { | ||
164 | struct dp83640_private *dp83640 = phydev->priv; | ||
165 | int val; | ||
166 | |||
167 | if (dp83640->clock->page != page) { | ||
168 | broadcast_write(phydev->bus, PAGESEL, page); | ||
169 | dp83640->clock->page = page; | ||
170 | } | ||
171 | val = phy_read(phydev, regnum); | ||
172 | |||
173 | return val; | ||
174 | } | ||
175 | |||
176 | /* Caller must hold extreg_lock. */ | ||
177 | static void ext_write(int broadcast, struct phy_device *phydev, | ||
178 | int page, u32 regnum, u16 val) | ||
179 | { | ||
180 | struct dp83640_private *dp83640 = phydev->priv; | ||
181 | |||
182 | if (dp83640->clock->page != page) { | ||
183 | broadcast_write(phydev->bus, PAGESEL, page); | ||
184 | dp83640->clock->page = page; | ||
185 | } | ||
186 | if (broadcast) | ||
187 | broadcast_write(phydev->bus, regnum, val); | ||
188 | else | ||
189 | phy_write(phydev, regnum, val); | ||
190 | } | ||
191 | |||
192 | /* Caller must hold extreg_lock. */ | ||
193 | static int tdr_write(int bc, struct phy_device *dev, | ||
194 | const struct timespec *ts, u16 cmd) | ||
195 | { | ||
196 | ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_nsec & 0xffff);/* ns[15:0] */ | ||
197 | ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_nsec >> 16); /* ns[31:16] */ | ||
198 | ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_sec & 0xffff); /* sec[15:0] */ | ||
199 | ext_write(bc, dev, PAGE4, PTP_TDR, ts->tv_sec >> 16); /* sec[31:16]*/ | ||
200 | |||
201 | ext_write(bc, dev, PAGE4, PTP_CTL, cmd); | ||
202 | |||
203 | return 0; | ||
204 | } | ||
205 | |||
206 | /* convert phy timestamps into driver timestamps */ | ||
207 | |||
208 | static void phy2rxts(struct phy_rxts *p, struct rxts *rxts) | ||
209 | { | ||
210 | u32 sec; | ||
211 | |||
212 | sec = p->sec_lo; | ||
213 | sec |= p->sec_hi << 16; | ||
214 | |||
215 | rxts->ns = p->ns_lo; | ||
216 | rxts->ns |= (p->ns_hi & 0x3fff) << 16; | ||
217 | rxts->ns += ((u64)sec) * 1000000000ULL; | ||
218 | rxts->seqid = p->seqid; | ||
219 | rxts->msgtype = (p->msgtype >> 12) & 0xf; | ||
220 | rxts->hash = p->msgtype & 0x0fff; | ||
221 | rxts->tmo = jiffies + HZ; | ||
222 | } | ||
223 | |||
224 | static u64 phy2txts(struct phy_txts *p) | ||
225 | { | ||
226 | u64 ns; | ||
227 | u32 sec; | ||
228 | |||
229 | sec = p->sec_lo; | ||
230 | sec |= p->sec_hi << 16; | ||
231 | |||
232 | ns = p->ns_lo; | ||
233 | ns |= (p->ns_hi & 0x3fff) << 16; | ||
234 | ns += ((u64)sec) * 1000000000ULL; | ||
235 | |||
236 | return ns; | ||
237 | } | ||
238 | |||
239 | /* ptp clock methods */ | ||
240 | |||
241 | static int ptp_dp83640_adjfreq(struct ptp_clock_info *ptp, s32 ppb) | ||
242 | { | ||
243 | struct dp83640_clock *clock = | ||
244 | container_of(ptp, struct dp83640_clock, caps); | ||
245 | struct phy_device *phydev = clock->chosen->phydev; | ||
246 | u64 rate; | ||
247 | int neg_adj = 0; | ||
248 | u16 hi, lo; | ||
249 | |||
250 | if (ppb < 0) { | ||
251 | neg_adj = 1; | ||
252 | ppb = -ppb; | ||
253 | } | ||
254 | rate = ppb; | ||
255 | rate <<= 26; | ||
256 | rate = div_u64(rate, 1953125); | ||
257 | |||
258 | hi = (rate >> 16) & PTP_RATE_HI_MASK; | ||
259 | if (neg_adj) | ||
260 | hi |= PTP_RATE_DIR; | ||
261 | |||
262 | lo = rate & 0xffff; | ||
263 | |||
264 | mutex_lock(&clock->extreg_lock); | ||
265 | |||
266 | ext_write(1, phydev, PAGE4, PTP_RATEH, hi); | ||
267 | ext_write(1, phydev, PAGE4, PTP_RATEL, lo); | ||
268 | |||
269 | mutex_unlock(&clock->extreg_lock); | ||
270 | |||
271 | return 0; | ||
272 | } | ||
273 | |||
274 | static int ptp_dp83640_adjtime(struct ptp_clock_info *ptp, s64 delta) | ||
275 | { | ||
276 | struct dp83640_clock *clock = | ||
277 | container_of(ptp, struct dp83640_clock, caps); | ||
278 | struct phy_device *phydev = clock->chosen->phydev; | ||
279 | struct timespec ts; | ||
280 | int err; | ||
281 | |||
282 | delta += ADJTIME_FIX; | ||
283 | |||
284 | ts = ns_to_timespec(delta); | ||
285 | |||
286 | mutex_lock(&clock->extreg_lock); | ||
287 | |||
288 | err = tdr_write(1, phydev, &ts, PTP_STEP_CLK); | ||
289 | |||
290 | mutex_unlock(&clock->extreg_lock); | ||
291 | |||
292 | return err; | ||
293 | } | ||
294 | |||
295 | static int ptp_dp83640_gettime(struct ptp_clock_info *ptp, struct timespec *ts) | ||
296 | { | ||
297 | struct dp83640_clock *clock = | ||
298 | container_of(ptp, struct dp83640_clock, caps); | ||
299 | struct phy_device *phydev = clock->chosen->phydev; | ||
300 | unsigned int val[4]; | ||
301 | |||
302 | mutex_lock(&clock->extreg_lock); | ||
303 | |||
304 | ext_write(0, phydev, PAGE4, PTP_CTL, PTP_RD_CLK); | ||
305 | |||
306 | val[0] = ext_read(phydev, PAGE4, PTP_TDR); /* ns[15:0] */ | ||
307 | val[1] = ext_read(phydev, PAGE4, PTP_TDR); /* ns[31:16] */ | ||
308 | val[2] = ext_read(phydev, PAGE4, PTP_TDR); /* sec[15:0] */ | ||
309 | val[3] = ext_read(phydev, PAGE4, PTP_TDR); /* sec[31:16] */ | ||
310 | |||
311 | mutex_unlock(&clock->extreg_lock); | ||
312 | |||
313 | ts->tv_nsec = val[0] | (val[1] << 16); | ||
314 | ts->tv_sec = val[2] | (val[3] << 16); | ||
315 | |||
316 | return 0; | ||
317 | } | ||
318 | |||
319 | static int ptp_dp83640_settime(struct ptp_clock_info *ptp, | ||
320 | const struct timespec *ts) | ||
321 | { | ||
322 | struct dp83640_clock *clock = | ||
323 | container_of(ptp, struct dp83640_clock, caps); | ||
324 | struct phy_device *phydev = clock->chosen->phydev; | ||
325 | int err; | ||
326 | |||
327 | mutex_lock(&clock->extreg_lock); | ||
328 | |||
329 | err = tdr_write(1, phydev, ts, PTP_LOAD_CLK); | ||
330 | |||
331 | mutex_unlock(&clock->extreg_lock); | ||
332 | |||
333 | return err; | ||
334 | } | ||
335 | |||
336 | static int ptp_dp83640_enable(struct ptp_clock_info *ptp, | ||
337 | struct ptp_clock_request *rq, int on) | ||
338 | { | ||
339 | struct dp83640_clock *clock = | ||
340 | container_of(ptp, struct dp83640_clock, caps); | ||
341 | struct phy_device *phydev = clock->chosen->phydev; | ||
342 | u16 evnt; | ||
343 | |||
344 | switch (rq->type) { | ||
345 | case PTP_CLK_REQ_EXTTS: | ||
346 | if (rq->extts.index != 0) | ||
347 | return -EINVAL; | ||
348 | evnt = EVNT_WR | (EXT_EVENT & EVNT_SEL_MASK) << EVNT_SEL_SHIFT; | ||
349 | if (on) { | ||
350 | evnt |= (EXT_GPIO & EVNT_GPIO_MASK) << EVNT_GPIO_SHIFT; | ||
351 | evnt |= EVNT_RISE; | ||
352 | } | ||
353 | ext_write(0, phydev, PAGE5, PTP_EVNT, evnt); | ||
354 | return 0; | ||
355 | default: | ||
356 | break; | ||
357 | } | ||
358 | |||
359 | return -EOPNOTSUPP; | ||
360 | } | ||
361 | |||
362 | static u8 status_frame_dst[6] = { 0x01, 0x1B, 0x19, 0x00, 0x00, 0x00 }; | ||
363 | static u8 status_frame_src[6] = { 0x08, 0x00, 0x17, 0x0B, 0x6B, 0x0F }; | ||
364 | |||
365 | static void enable_status_frames(struct phy_device *phydev, bool on) | ||
366 | { | ||
367 | u16 cfg0 = 0, ver; | ||
368 | |||
369 | if (on) | ||
370 | cfg0 = PSF_EVNT_EN | PSF_RXTS_EN | PSF_TXTS_EN | ENDIAN_FLAG; | ||
371 | |||
372 | ver = (PSF_PTPVER & VERSIONPTP_MASK) << VERSIONPTP_SHIFT; | ||
373 | |||
374 | ext_write(0, phydev, PAGE5, PSF_CFG0, cfg0); | ||
375 | ext_write(0, phydev, PAGE6, PSF_CFG1, ver); | ||
376 | |||
377 | if (!phydev->attached_dev) { | ||
378 | pr_warning("dp83640: expected to find an attached netdevice\n"); | ||
379 | return; | ||
380 | } | ||
381 | |||
382 | if (on) { | ||
383 | if (dev_mc_add(phydev->attached_dev, status_frame_dst)) | ||
384 | pr_warning("dp83640: failed to add mc address\n"); | ||
385 | } else { | ||
386 | if (dev_mc_del(phydev->attached_dev, status_frame_dst)) | ||
387 | pr_warning("dp83640: failed to delete mc address\n"); | ||
388 | } | ||
389 | } | ||
390 | |||
391 | static bool is_status_frame(struct sk_buff *skb, int type) | ||
392 | { | ||
393 | struct ethhdr *h = eth_hdr(skb); | ||
394 | |||
395 | if (PTP_CLASS_V2_L2 == type && | ||
396 | !memcmp(h->h_source, status_frame_src, sizeof(status_frame_src))) | ||
397 | return true; | ||
398 | else | ||
399 | return false; | ||
400 | } | ||
401 | |||
402 | static int expired(struct rxts *rxts) | ||
403 | { | ||
404 | return time_after(jiffies, rxts->tmo); | ||
405 | } | ||
406 | |||
407 | /* Caller must hold rx_lock. */ | ||
408 | static void prune_rx_ts(struct dp83640_private *dp83640) | ||
409 | { | ||
410 | struct list_head *this, *next; | ||
411 | struct rxts *rxts; | ||
412 | |||
413 | list_for_each_safe(this, next, &dp83640->rxts) { | ||
414 | rxts = list_entry(this, struct rxts, list); | ||
415 | if (expired(rxts)) { | ||
416 | list_del_init(&rxts->list); | ||
417 | list_add(&rxts->list, &dp83640->rxpool); | ||
418 | } | ||
419 | } | ||
420 | } | ||
421 | |||
422 | /* synchronize the phyters so they act as one clock */ | ||
423 | |||
424 | static void enable_broadcast(struct phy_device *phydev, int init_page, int on) | ||
425 | { | ||
426 | int val; | ||
427 | phy_write(phydev, PAGESEL, 0); | ||
428 | val = phy_read(phydev, PHYCR2); | ||
429 | if (on) | ||
430 | val |= BC_WRITE; | ||
431 | else | ||
432 | val &= ~BC_WRITE; | ||
433 | phy_write(phydev, PHYCR2, val); | ||
434 | phy_write(phydev, PAGESEL, init_page); | ||
435 | } | ||
436 | |||
437 | static void recalibrate(struct dp83640_clock *clock) | ||
438 | { | ||
439 | s64 now, diff; | ||
440 | struct phy_txts event_ts; | ||
441 | struct timespec ts; | ||
442 | struct list_head *this; | ||
443 | struct dp83640_private *tmp; | ||
444 | struct phy_device *master = clock->chosen->phydev; | ||
445 | u16 cfg0, evnt, ptp_trig, trigger, val; | ||
446 | |||
447 | trigger = CAL_TRIGGER; | ||
448 | |||
449 | mutex_lock(&clock->extreg_lock); | ||
450 | |||
451 | /* | ||
452 | * enable broadcast, disable status frames, enable ptp clock | ||
453 | */ | ||
454 | list_for_each(this, &clock->phylist) { | ||
455 | tmp = list_entry(this, struct dp83640_private, list); | ||
456 | enable_broadcast(tmp->phydev, clock->page, 1); | ||
457 | tmp->cfg0 = ext_read(tmp->phydev, PAGE5, PSF_CFG0); | ||
458 | ext_write(0, tmp->phydev, PAGE5, PSF_CFG0, 0); | ||
459 | ext_write(0, tmp->phydev, PAGE4, PTP_CTL, PTP_ENABLE); | ||
460 | } | ||
461 | enable_broadcast(master, clock->page, 1); | ||
462 | cfg0 = ext_read(master, PAGE5, PSF_CFG0); | ||
463 | ext_write(0, master, PAGE5, PSF_CFG0, 0); | ||
464 | ext_write(0, master, PAGE4, PTP_CTL, PTP_ENABLE); | ||
465 | |||
466 | /* | ||
467 | * enable an event timestamp | ||
468 | */ | ||
469 | evnt = EVNT_WR | EVNT_RISE | EVNT_SINGLE; | ||
470 | evnt |= (CAL_EVENT & EVNT_SEL_MASK) << EVNT_SEL_SHIFT; | ||
471 | evnt |= (cal_gpio & EVNT_GPIO_MASK) << EVNT_GPIO_SHIFT; | ||
472 | |||
473 | list_for_each(this, &clock->phylist) { | ||
474 | tmp = list_entry(this, struct dp83640_private, list); | ||
475 | ext_write(0, tmp->phydev, PAGE5, PTP_EVNT, evnt); | ||
476 | } | ||
477 | ext_write(0, master, PAGE5, PTP_EVNT, evnt); | ||
478 | |||
479 | /* | ||
480 | * configure a trigger | ||
481 | */ | ||
482 | ptp_trig = TRIG_WR | TRIG_IF_LATE | TRIG_PULSE; | ||
483 | ptp_trig |= (trigger & TRIG_CSEL_MASK) << TRIG_CSEL_SHIFT; | ||
484 | ptp_trig |= (cal_gpio & TRIG_GPIO_MASK) << TRIG_GPIO_SHIFT; | ||
485 | ext_write(0, master, PAGE5, PTP_TRIG, ptp_trig); | ||
486 | |||
487 | /* load trigger */ | ||
488 | val = (trigger & TRIG_SEL_MASK) << TRIG_SEL_SHIFT; | ||
489 | val |= TRIG_LOAD; | ||
490 | ext_write(0, master, PAGE4, PTP_CTL, val); | ||
491 | |||
492 | /* enable trigger */ | ||
493 | val &= ~TRIG_LOAD; | ||
494 | val |= TRIG_EN; | ||
495 | ext_write(0, master, PAGE4, PTP_CTL, val); | ||
496 | |||
497 | /* disable trigger */ | ||
498 | val = (trigger & TRIG_SEL_MASK) << TRIG_SEL_SHIFT; | ||
499 | val |= TRIG_DIS; | ||
500 | ext_write(0, master, PAGE4, PTP_CTL, val); | ||
501 | |||
502 | /* | ||
503 | * read out and correct offsets | ||
504 | */ | ||
505 | val = ext_read(master, PAGE4, PTP_STS); | ||
506 | pr_info("master PTP_STS 0x%04hx", val); | ||
507 | val = ext_read(master, PAGE4, PTP_ESTS); | ||
508 | pr_info("master PTP_ESTS 0x%04hx", val); | ||
509 | event_ts.ns_lo = ext_read(master, PAGE4, PTP_EDATA); | ||
510 | event_ts.ns_hi = ext_read(master, PAGE4, PTP_EDATA); | ||
511 | event_ts.sec_lo = ext_read(master, PAGE4, PTP_EDATA); | ||
512 | event_ts.sec_hi = ext_read(master, PAGE4, PTP_EDATA); | ||
513 | now = phy2txts(&event_ts); | ||
514 | |||
515 | list_for_each(this, &clock->phylist) { | ||
516 | tmp = list_entry(this, struct dp83640_private, list); | ||
517 | val = ext_read(tmp->phydev, PAGE4, PTP_STS); | ||
518 | pr_info("slave PTP_STS 0x%04hx", val); | ||
519 | val = ext_read(tmp->phydev, PAGE4, PTP_ESTS); | ||
520 | pr_info("slave PTP_ESTS 0x%04hx", val); | ||
521 | event_ts.ns_lo = ext_read(tmp->phydev, PAGE4, PTP_EDATA); | ||
522 | event_ts.ns_hi = ext_read(tmp->phydev, PAGE4, PTP_EDATA); | ||
523 | event_ts.sec_lo = ext_read(tmp->phydev, PAGE4, PTP_EDATA); | ||
524 | event_ts.sec_hi = ext_read(tmp->phydev, PAGE4, PTP_EDATA); | ||
525 | diff = now - (s64) phy2txts(&event_ts); | ||
526 | pr_info("slave offset %lld nanoseconds\n", diff); | ||
527 | diff += ADJTIME_FIX; | ||
528 | ts = ns_to_timespec(diff); | ||
529 | tdr_write(0, tmp->phydev, &ts, PTP_STEP_CLK); | ||
530 | } | ||
531 | |||
532 | /* | ||
533 | * restore status frames | ||
534 | */ | ||
535 | list_for_each(this, &clock->phylist) { | ||
536 | tmp = list_entry(this, struct dp83640_private, list); | ||
537 | ext_write(0, tmp->phydev, PAGE5, PSF_CFG0, tmp->cfg0); | ||
538 | } | ||
539 | ext_write(0, master, PAGE5, PSF_CFG0, cfg0); | ||
540 | |||
541 | mutex_unlock(&clock->extreg_lock); | ||
542 | } | ||
543 | |||
544 | /* time stamping methods */ | ||
545 | |||
546 | static int decode_evnt(struct dp83640_private *dp83640, | ||
547 | void *data, u16 ests) | ||
548 | { | ||
549 | struct phy_txts *phy_txts; | ||
550 | struct ptp_clock_event event; | ||
551 | int words = (ests >> EVNT_TS_LEN_SHIFT) & EVNT_TS_LEN_MASK; | ||
552 | u16 ext_status = 0; | ||
553 | |||
554 | if (ests & MULT_EVNT) { | ||
555 | ext_status = *(u16 *) data; | ||
556 | data += sizeof(ext_status); | ||
557 | } | ||
558 | |||
559 | phy_txts = data; | ||
560 | |||
561 | switch (words) { /* fall through in every case */ | ||
562 | case 3: | ||
563 | dp83640->edata.sec_hi = phy_txts->sec_hi; | ||
564 | case 2: | ||
565 | dp83640->edata.sec_lo = phy_txts->sec_lo; | ||
566 | case 1: | ||
567 | dp83640->edata.ns_hi = phy_txts->ns_hi; | ||
568 | case 0: | ||
569 | dp83640->edata.ns_lo = phy_txts->ns_lo; | ||
570 | } | ||
571 | |||
572 | event.type = PTP_CLOCK_EXTTS; | ||
573 | event.index = 0; | ||
574 | event.timestamp = phy2txts(&dp83640->edata); | ||
575 | |||
576 | ptp_clock_event(dp83640->clock->ptp_clock, &event); | ||
577 | |||
578 | words = ext_status ? words + 2 : words + 1; | ||
579 | return words * sizeof(u16); | ||
580 | } | ||
581 | |||
582 | static void decode_rxts(struct dp83640_private *dp83640, | ||
583 | struct phy_rxts *phy_rxts) | ||
584 | { | ||
585 | struct rxts *rxts; | ||
586 | unsigned long flags; | ||
587 | |||
588 | spin_lock_irqsave(&dp83640->rx_lock, flags); | ||
589 | |||
590 | prune_rx_ts(dp83640); | ||
591 | |||
592 | if (list_empty(&dp83640->rxpool)) { | ||
593 | pr_warning("dp83640: rx timestamp pool is empty\n"); | ||
594 | goto out; | ||
595 | } | ||
596 | rxts = list_first_entry(&dp83640->rxpool, struct rxts, list); | ||
597 | list_del_init(&rxts->list); | ||
598 | phy2rxts(phy_rxts, rxts); | ||
599 | list_add_tail(&rxts->list, &dp83640->rxts); | ||
600 | out: | ||
601 | spin_unlock_irqrestore(&dp83640->rx_lock, flags); | ||
602 | } | ||
603 | |||
604 | static void decode_txts(struct dp83640_private *dp83640, | ||
605 | struct phy_txts *phy_txts) | ||
606 | { | ||
607 | struct skb_shared_hwtstamps shhwtstamps; | ||
608 | struct sk_buff *skb; | ||
609 | u64 ns; | ||
610 | |||
611 | /* We must already have the skb that triggered this. */ | ||
612 | |||
613 | skb = skb_dequeue(&dp83640->tx_queue); | ||
614 | |||
615 | if (!skb) { | ||
616 | pr_warning("dp83640: have timestamp but tx_queue empty\n"); | ||
617 | return; | ||
618 | } | ||
619 | ns = phy2txts(phy_txts); | ||
620 | memset(&shhwtstamps, 0, sizeof(shhwtstamps)); | ||
621 | shhwtstamps.hwtstamp = ns_to_ktime(ns); | ||
622 | skb_complete_tx_timestamp(skb, &shhwtstamps); | ||
623 | } | ||
624 | |||
625 | static void decode_status_frame(struct dp83640_private *dp83640, | ||
626 | struct sk_buff *skb) | ||
627 | { | ||
628 | struct phy_rxts *phy_rxts; | ||
629 | struct phy_txts *phy_txts; | ||
630 | u8 *ptr; | ||
631 | int len, size; | ||
632 | u16 ests, type; | ||
633 | |||
634 | ptr = skb->data + 2; | ||
635 | |||
636 | for (len = skb_headlen(skb) - 2; len > sizeof(type); len -= size) { | ||
637 | |||
638 | type = *(u16 *)ptr; | ||
639 | ests = type & 0x0fff; | ||
640 | type = type & 0xf000; | ||
641 | len -= sizeof(type); | ||
642 | ptr += sizeof(type); | ||
643 | |||
644 | if (PSF_RX == type && len >= sizeof(*phy_rxts)) { | ||
645 | |||
646 | phy_rxts = (struct phy_rxts *) ptr; | ||
647 | decode_rxts(dp83640, phy_rxts); | ||
648 | size = sizeof(*phy_rxts); | ||
649 | |||
650 | } else if (PSF_TX == type && len >= sizeof(*phy_txts)) { | ||
651 | |||
652 | phy_txts = (struct phy_txts *) ptr; | ||
653 | decode_txts(dp83640, phy_txts); | ||
654 | size = sizeof(*phy_txts); | ||
655 | |||
656 | } else if (PSF_EVNT == type && len >= sizeof(*phy_txts)) { | ||
657 | |||
658 | size = decode_evnt(dp83640, ptr, ests); | ||
659 | |||
660 | } else { | ||
661 | size = 0; | ||
662 | break; | ||
663 | } | ||
664 | ptr += size; | ||
665 | } | ||
666 | } | ||
667 | |||
668 | static int match(struct sk_buff *skb, unsigned int type, struct rxts *rxts) | ||
669 | { | ||
670 | u16 *seqid; | ||
671 | unsigned int offset; | ||
672 | u8 *msgtype, *data = skb_mac_header(skb); | ||
673 | |||
674 | /* check sequenceID, messageType, 12 bit hash of offset 20-29 */ | ||
675 | |||
676 | switch (type) { | ||
677 | case PTP_CLASS_V1_IPV4: | ||
678 | case PTP_CLASS_V2_IPV4: | ||
679 | offset = ETH_HLEN + IPV4_HLEN(data) + UDP_HLEN; | ||
680 | break; | ||
681 | case PTP_CLASS_V1_IPV6: | ||
682 | case PTP_CLASS_V2_IPV6: | ||
683 | offset = OFF_PTP6; | ||
684 | break; | ||
685 | case PTP_CLASS_V2_L2: | ||
686 | offset = ETH_HLEN; | ||
687 | break; | ||
688 | case PTP_CLASS_V2_VLAN: | ||
689 | offset = ETH_HLEN + VLAN_HLEN; | ||
690 | break; | ||
691 | default: | ||
692 | return 0; | ||
693 | } | ||
694 | |||
695 | if (skb->len + ETH_HLEN < offset + OFF_PTP_SEQUENCE_ID + sizeof(*seqid)) | ||
696 | return 0; | ||
697 | |||
698 | if (unlikely(type & PTP_CLASS_V1)) | ||
699 | msgtype = data + offset + OFF_PTP_CONTROL; | ||
700 | else | ||
701 | msgtype = data + offset; | ||
702 | |||
703 | seqid = (u16 *)(data + offset + OFF_PTP_SEQUENCE_ID); | ||
704 | |||
705 | return (rxts->msgtype == (*msgtype & 0xf) && | ||
706 | rxts->seqid == ntohs(*seqid)); | ||
707 | } | ||
708 | |||
709 | static void dp83640_free_clocks(void) | ||
710 | { | ||
711 | struct dp83640_clock *clock; | ||
712 | struct list_head *this, *next; | ||
713 | |||
714 | mutex_lock(&phyter_clocks_lock); | ||
715 | |||
716 | list_for_each_safe(this, next, &phyter_clocks) { | ||
717 | clock = list_entry(this, struct dp83640_clock, list); | ||
718 | if (!list_empty(&clock->phylist)) { | ||
719 | pr_warning("phy list non-empty while unloading"); | ||
720 | BUG(); | ||
721 | } | ||
722 | list_del(&clock->list); | ||
723 | mutex_destroy(&clock->extreg_lock); | ||
724 | mutex_destroy(&clock->clock_lock); | ||
725 | put_device(&clock->bus->dev); | ||
726 | kfree(clock); | ||
727 | } | ||
728 | |||
729 | mutex_unlock(&phyter_clocks_lock); | ||
730 | } | ||
731 | |||
732 | static void dp83640_clock_init(struct dp83640_clock *clock, struct mii_bus *bus) | ||
733 | { | ||
734 | INIT_LIST_HEAD(&clock->list); | ||
735 | clock->bus = bus; | ||
736 | mutex_init(&clock->extreg_lock); | ||
737 | mutex_init(&clock->clock_lock); | ||
738 | INIT_LIST_HEAD(&clock->phylist); | ||
739 | clock->caps.owner = THIS_MODULE; | ||
740 | sprintf(clock->caps.name, "dp83640 timer"); | ||
741 | clock->caps.max_adj = 1953124; | ||
742 | clock->caps.n_alarm = 0; | ||
743 | clock->caps.n_ext_ts = N_EXT_TS; | ||
744 | clock->caps.n_per_out = 0; | ||
745 | clock->caps.pps = 0; | ||
746 | clock->caps.adjfreq = ptp_dp83640_adjfreq; | ||
747 | clock->caps.adjtime = ptp_dp83640_adjtime; | ||
748 | clock->caps.gettime = ptp_dp83640_gettime; | ||
749 | clock->caps.settime = ptp_dp83640_settime; | ||
750 | clock->caps.enable = ptp_dp83640_enable; | ||
751 | /* | ||
752 | * Get a reference to this bus instance. | ||
753 | */ | ||
754 | get_device(&bus->dev); | ||
755 | } | ||
756 | |||
757 | static int choose_this_phy(struct dp83640_clock *clock, | ||
758 | struct phy_device *phydev) | ||
759 | { | ||
760 | if (chosen_phy == -1 && !clock->chosen) | ||
761 | return 1; | ||
762 | |||
763 | if (chosen_phy == phydev->addr) | ||
764 | return 1; | ||
765 | |||
766 | return 0; | ||
767 | } | ||
768 | |||
769 | static struct dp83640_clock *dp83640_clock_get(struct dp83640_clock *clock) | ||
770 | { | ||
771 | if (clock) | ||
772 | mutex_lock(&clock->clock_lock); | ||
773 | return clock; | ||
774 | } | ||
775 | |||
776 | /* | ||
777 | * Look up and lock a clock by bus instance. | ||
778 | * If there is no clock for this bus, then create it first. | ||
779 | */ | ||
780 | static struct dp83640_clock *dp83640_clock_get_bus(struct mii_bus *bus) | ||
781 | { | ||
782 | struct dp83640_clock *clock = NULL, *tmp; | ||
783 | struct list_head *this; | ||
784 | |||
785 | mutex_lock(&phyter_clocks_lock); | ||
786 | |||
787 | list_for_each(this, &phyter_clocks) { | ||
788 | tmp = list_entry(this, struct dp83640_clock, list); | ||
789 | if (tmp->bus == bus) { | ||
790 | clock = tmp; | ||
791 | break; | ||
792 | } | ||
793 | } | ||
794 | if (clock) | ||
795 | goto out; | ||
796 | |||
797 | clock = kzalloc(sizeof(struct dp83640_clock), GFP_KERNEL); | ||
798 | if (!clock) | ||
799 | goto out; | ||
800 | |||
801 | dp83640_clock_init(clock, bus); | ||
802 | list_add_tail(&phyter_clocks, &clock->list); | ||
803 | out: | ||
804 | mutex_unlock(&phyter_clocks_lock); | ||
805 | |||
806 | return dp83640_clock_get(clock); | ||
807 | } | ||
808 | |||
809 | static void dp83640_clock_put(struct dp83640_clock *clock) | ||
810 | { | ||
811 | mutex_unlock(&clock->clock_lock); | ||
812 | } | ||
813 | |||
814 | static int dp83640_probe(struct phy_device *phydev) | ||
815 | { | ||
816 | struct dp83640_clock *clock; | ||
817 | struct dp83640_private *dp83640; | ||
818 | int err = -ENOMEM, i; | ||
819 | |||
820 | if (phydev->addr == BROADCAST_ADDR) | ||
821 | return 0; | ||
822 | |||
823 | clock = dp83640_clock_get_bus(phydev->bus); | ||
824 | if (!clock) | ||
825 | goto no_clock; | ||
826 | |||
827 | dp83640 = kzalloc(sizeof(struct dp83640_private), GFP_KERNEL); | ||
828 | if (!dp83640) | ||
829 | goto no_memory; | ||
830 | |||
831 | dp83640->phydev = phydev; | ||
832 | INIT_WORK(&dp83640->ts_work, rx_timestamp_work); | ||
833 | |||
834 | INIT_LIST_HEAD(&dp83640->rxts); | ||
835 | INIT_LIST_HEAD(&dp83640->rxpool); | ||
836 | for (i = 0; i < MAX_RXTS; i++) | ||
837 | list_add(&dp83640->rx_pool_data[i].list, &dp83640->rxpool); | ||
838 | |||
839 | phydev->priv = dp83640; | ||
840 | |||
841 | spin_lock_init(&dp83640->rx_lock); | ||
842 | skb_queue_head_init(&dp83640->rx_queue); | ||
843 | skb_queue_head_init(&dp83640->tx_queue); | ||
844 | |||
845 | dp83640->clock = clock; | ||
846 | |||
847 | if (choose_this_phy(clock, phydev)) { | ||
848 | clock->chosen = dp83640; | ||
849 | clock->ptp_clock = ptp_clock_register(&clock->caps); | ||
850 | if (IS_ERR(clock->ptp_clock)) { | ||
851 | err = PTR_ERR(clock->ptp_clock); | ||
852 | goto no_register; | ||
853 | } | ||
854 | } else | ||
855 | list_add_tail(&dp83640->list, &clock->phylist); | ||
856 | |||
857 | if (clock->chosen && !list_empty(&clock->phylist)) | ||
858 | recalibrate(clock); | ||
859 | else | ||
860 | enable_broadcast(dp83640->phydev, clock->page, 1); | ||
861 | |||
862 | dp83640_clock_put(clock); | ||
863 | return 0; | ||
864 | |||
865 | no_register: | ||
866 | clock->chosen = NULL; | ||
867 | kfree(dp83640); | ||
868 | no_memory: | ||
869 | dp83640_clock_put(clock); | ||
870 | no_clock: | ||
871 | return err; | ||
872 | } | ||
873 | |||
874 | static void dp83640_remove(struct phy_device *phydev) | ||
875 | { | ||
876 | struct dp83640_clock *clock; | ||
877 | struct list_head *this, *next; | ||
878 | struct dp83640_private *tmp, *dp83640 = phydev->priv; | ||
879 | |||
880 | if (phydev->addr == BROADCAST_ADDR) | ||
881 | return; | ||
882 | |||
883 | enable_status_frames(phydev, false); | ||
884 | cancel_work_sync(&dp83640->ts_work); | ||
885 | |||
886 | clock = dp83640_clock_get(dp83640->clock); | ||
887 | |||
888 | if (dp83640 == clock->chosen) { | ||
889 | ptp_clock_unregister(clock->ptp_clock); | ||
890 | clock->chosen = NULL; | ||
891 | } else { | ||
892 | list_for_each_safe(this, next, &clock->phylist) { | ||
893 | tmp = list_entry(this, struct dp83640_private, list); | ||
894 | if (tmp == dp83640) { | ||
895 | list_del_init(&tmp->list); | ||
896 | break; | ||
897 | } | ||
898 | } | ||
899 | } | ||
900 | |||
901 | dp83640_clock_put(clock); | ||
902 | kfree(dp83640); | ||
903 | } | ||
904 | |||
905 | static int dp83640_hwtstamp(struct phy_device *phydev, struct ifreq *ifr) | ||
906 | { | ||
907 | struct dp83640_private *dp83640 = phydev->priv; | ||
908 | struct hwtstamp_config cfg; | ||
909 | u16 txcfg0, rxcfg0; | ||
910 | |||
911 | if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) | ||
912 | return -EFAULT; | ||
913 | |||
914 | if (cfg.flags) /* reserved for future extensions */ | ||
915 | return -EINVAL; | ||
916 | |||
917 | switch (cfg.tx_type) { | ||
918 | case HWTSTAMP_TX_OFF: | ||
919 | dp83640->hwts_tx_en = 0; | ||
920 | break; | ||
921 | case HWTSTAMP_TX_ON: | ||
922 | dp83640->hwts_tx_en = 1; | ||
923 | break; | ||
924 | default: | ||
925 | return -ERANGE; | ||
926 | } | ||
927 | |||
928 | switch (cfg.rx_filter) { | ||
929 | case HWTSTAMP_FILTER_NONE: | ||
930 | dp83640->hwts_rx_en = 0; | ||
931 | dp83640->layer = 0; | ||
932 | dp83640->version = 0; | ||
933 | break; | ||
934 | case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: | ||
935 | case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: | ||
936 | case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: | ||
937 | dp83640->hwts_rx_en = 1; | ||
938 | dp83640->layer = LAYER4; | ||
939 | dp83640->version = 1; | ||
940 | break; | ||
941 | case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: | ||
942 | case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: | ||
943 | case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: | ||
944 | dp83640->hwts_rx_en = 1; | ||
945 | dp83640->layer = LAYER4; | ||
946 | dp83640->version = 2; | ||
947 | break; | ||
948 | case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: | ||
949 | case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: | ||
950 | case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: | ||
951 | dp83640->hwts_rx_en = 1; | ||
952 | dp83640->layer = LAYER2; | ||
953 | dp83640->version = 2; | ||
954 | break; | ||
955 | case HWTSTAMP_FILTER_PTP_V2_EVENT: | ||
956 | case HWTSTAMP_FILTER_PTP_V2_SYNC: | ||
957 | case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: | ||
958 | dp83640->hwts_rx_en = 1; | ||
959 | dp83640->layer = LAYER4|LAYER2; | ||
960 | dp83640->version = 2; | ||
961 | break; | ||
962 | default: | ||
963 | return -ERANGE; | ||
964 | } | ||
965 | |||
966 | txcfg0 = (dp83640->version & TX_PTP_VER_MASK) << TX_PTP_VER_SHIFT; | ||
967 | rxcfg0 = (dp83640->version & TX_PTP_VER_MASK) << TX_PTP_VER_SHIFT; | ||
968 | |||
969 | if (dp83640->layer & LAYER2) { | ||
970 | txcfg0 |= TX_L2_EN; | ||
971 | rxcfg0 |= RX_L2_EN; | ||
972 | } | ||
973 | if (dp83640->layer & LAYER4) { | ||
974 | txcfg0 |= TX_IPV6_EN | TX_IPV4_EN; | ||
975 | rxcfg0 |= RX_IPV6_EN | RX_IPV4_EN; | ||
976 | } | ||
977 | |||
978 | if (dp83640->hwts_tx_en) | ||
979 | txcfg0 |= TX_TS_EN; | ||
980 | |||
981 | if (dp83640->hwts_rx_en) | ||
982 | rxcfg0 |= RX_TS_EN; | ||
983 | |||
984 | mutex_lock(&dp83640->clock->extreg_lock); | ||
985 | |||
986 | if (dp83640->hwts_tx_en || dp83640->hwts_rx_en) { | ||
987 | enable_status_frames(phydev, true); | ||
988 | ext_write(0, phydev, PAGE4, PTP_CTL, PTP_ENABLE); | ||
989 | } | ||
990 | |||
991 | ext_write(0, phydev, PAGE5, PTP_TXCFG0, txcfg0); | ||
992 | ext_write(0, phydev, PAGE5, PTP_RXCFG0, rxcfg0); | ||
993 | |||
994 | mutex_unlock(&dp83640->clock->extreg_lock); | ||
995 | |||
996 | return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; | ||
997 | } | ||
998 | |||
999 | static void rx_timestamp_work(struct work_struct *work) | ||
1000 | { | ||
1001 | struct dp83640_private *dp83640 = | ||
1002 | container_of(work, struct dp83640_private, ts_work); | ||
1003 | struct list_head *this, *next; | ||
1004 | struct rxts *rxts; | ||
1005 | struct skb_shared_hwtstamps *shhwtstamps; | ||
1006 | struct sk_buff *skb; | ||
1007 | unsigned int type; | ||
1008 | unsigned long flags; | ||
1009 | |||
1010 | /* Deliver each deferred packet, with or without a time stamp. */ | ||
1011 | |||
1012 | while ((skb = skb_dequeue(&dp83640->rx_queue)) != NULL) { | ||
1013 | type = SKB_PTP_TYPE(skb); | ||
1014 | spin_lock_irqsave(&dp83640->rx_lock, flags); | ||
1015 | list_for_each_safe(this, next, &dp83640->rxts) { | ||
1016 | rxts = list_entry(this, struct rxts, list); | ||
1017 | if (match(skb, type, rxts)) { | ||
1018 | shhwtstamps = skb_hwtstamps(skb); | ||
1019 | memset(shhwtstamps, 0, sizeof(*shhwtstamps)); | ||
1020 | shhwtstamps->hwtstamp = ns_to_ktime(rxts->ns); | ||
1021 | list_del_init(&rxts->list); | ||
1022 | list_add(&rxts->list, &dp83640->rxpool); | ||
1023 | break; | ||
1024 | } | ||
1025 | } | ||
1026 | spin_unlock_irqrestore(&dp83640->rx_lock, flags); | ||
1027 | netif_rx(skb); | ||
1028 | } | ||
1029 | |||
1030 | /* Clear out expired time stamps. */ | ||
1031 | |||
1032 | spin_lock_irqsave(&dp83640->rx_lock, flags); | ||
1033 | prune_rx_ts(dp83640); | ||
1034 | spin_unlock_irqrestore(&dp83640->rx_lock, flags); | ||
1035 | } | ||
1036 | |||
1037 | static bool dp83640_rxtstamp(struct phy_device *phydev, | ||
1038 | struct sk_buff *skb, int type) | ||
1039 | { | ||
1040 | struct dp83640_private *dp83640 = phydev->priv; | ||
1041 | |||
1042 | if (!dp83640->hwts_rx_en) | ||
1043 | return false; | ||
1044 | |||
1045 | if (is_status_frame(skb, type)) { | ||
1046 | decode_status_frame(dp83640, skb); | ||
1047 | kfree_skb(skb); | ||
1048 | return true; | ||
1049 | } | ||
1050 | |||
1051 | SKB_PTP_TYPE(skb) = type; | ||
1052 | skb_queue_tail(&dp83640->rx_queue, skb); | ||
1053 | schedule_work(&dp83640->ts_work); | ||
1054 | |||
1055 | return true; | ||
1056 | } | ||
1057 | |||
1058 | static void dp83640_txtstamp(struct phy_device *phydev, | ||
1059 | struct sk_buff *skb, int type) | ||
1060 | { | ||
1061 | struct dp83640_private *dp83640 = phydev->priv; | ||
1062 | |||
1063 | if (!dp83640->hwts_tx_en) { | ||
1064 | kfree_skb(skb); | ||
1065 | return; | ||
1066 | } | ||
1067 | skb_queue_tail(&dp83640->tx_queue, skb); | ||
1068 | schedule_work(&dp83640->ts_work); | ||
1069 | } | ||
1070 | |||
1071 | static struct phy_driver dp83640_driver = { | ||
1072 | .phy_id = DP83640_PHY_ID, | ||
1073 | .phy_id_mask = 0xfffffff0, | ||
1074 | .name = "NatSemi DP83640", | ||
1075 | .features = PHY_BASIC_FEATURES, | ||
1076 | .flags = 0, | ||
1077 | .probe = dp83640_probe, | ||
1078 | .remove = dp83640_remove, | ||
1079 | .config_aneg = genphy_config_aneg, | ||
1080 | .read_status = genphy_read_status, | ||
1081 | .hwtstamp = dp83640_hwtstamp, | ||
1082 | .rxtstamp = dp83640_rxtstamp, | ||
1083 | .txtstamp = dp83640_txtstamp, | ||
1084 | .driver = {.owner = THIS_MODULE,} | ||
1085 | }; | ||
1086 | |||
1087 | static int __init dp83640_init(void) | ||
1088 | { | ||
1089 | return phy_driver_register(&dp83640_driver); | ||
1090 | } | ||
1091 | |||
1092 | static void __exit dp83640_exit(void) | ||
1093 | { | ||
1094 | dp83640_free_clocks(); | ||
1095 | phy_driver_unregister(&dp83640_driver); | ||
1096 | } | ||
1097 | |||
1098 | MODULE_DESCRIPTION("National Semiconductor DP83640 PHY driver"); | ||
1099 | MODULE_AUTHOR("Richard Cochran <richard.cochran@omicron.at>"); | ||
1100 | MODULE_LICENSE("GPL"); | ||
1101 | |||
1102 | module_init(dp83640_init); | ||
1103 | module_exit(dp83640_exit); | ||
1104 | |||
1105 | static struct mdio_device_id __maybe_unused dp83640_tbl[] = { | ||
1106 | { DP83640_PHY_ID, 0xfffffff0 }, | ||
1107 | { } | ||
1108 | }; | ||
1109 | |||
1110 | MODULE_DEVICE_TABLE(mdio, dp83640_tbl); | ||
diff --git a/drivers/net/phy/dp83640_reg.h b/drivers/net/phy/dp83640_reg.h new file mode 100644 index 00000000000..e7fe4111700 --- /dev/null +++ b/drivers/net/phy/dp83640_reg.h | |||
@@ -0,0 +1,267 @@ | |||
1 | /* dp83640_reg.h | ||
2 | * Generated by regen.tcl on Thu Feb 17 10:02:48 AM CET 2011 | ||
3 | */ | ||
4 | #ifndef HAVE_DP83640_REGISTERS | ||
5 | #define HAVE_DP83640_REGISTERS | ||
6 | |||
7 | #define PAGE0 0x0000 | ||
8 | #define PHYCR2 0x001c /* PHY Control Register 2 */ | ||
9 | |||
10 | #define PAGE4 0x0004 | ||
11 | #define PTP_CTL 0x0014 /* PTP Control Register */ | ||
12 | #define PTP_TDR 0x0015 /* PTP Time Data Register */ | ||
13 | #define PTP_STS 0x0016 /* PTP Status Register */ | ||
14 | #define PTP_TSTS 0x0017 /* PTP Trigger Status Register */ | ||
15 | #define PTP_RATEL 0x0018 /* PTP Rate Low Register */ | ||
16 | #define PTP_RATEH 0x0019 /* PTP Rate High Register */ | ||
17 | #define PTP_RDCKSUM 0x001a /* PTP Read Checksum */ | ||
18 | #define PTP_WRCKSUM 0x001b /* PTP Write Checksum */ | ||
19 | #define PTP_TXTS 0x001c /* PTP Transmit Timestamp Register, in four 16-bit reads */ | ||
20 | #define PTP_RXTS 0x001d /* PTP Receive Timestamp Register, in six? 16-bit reads */ | ||
21 | #define PTP_ESTS 0x001e /* PTP Event Status Register */ | ||
22 | #define PTP_EDATA 0x001f /* PTP Event Data Register */ | ||
23 | |||
24 | #define PAGE5 0x0005 | ||
25 | #define PTP_TRIG 0x0014 /* PTP Trigger Configuration Register */ | ||
26 | #define PTP_EVNT 0x0015 /* PTP Event Configuration Register */ | ||
27 | #define PTP_TXCFG0 0x0016 /* PTP Transmit Configuration Register 0 */ | ||
28 | #define PTP_TXCFG1 0x0017 /* PTP Transmit Configuration Register 1 */ | ||
29 | #define PSF_CFG0 0x0018 /* PHY Status Frame Configuration Register 0 */ | ||
30 | #define PTP_RXCFG0 0x0019 /* PTP Receive Configuration Register 0 */ | ||
31 | #define PTP_RXCFG1 0x001a /* PTP Receive Configuration Register 1 */ | ||
32 | #define PTP_RXCFG2 0x001b /* PTP Receive Configuration Register 2 */ | ||
33 | #define PTP_RXCFG3 0x001c /* PTP Receive Configuration Register 3 */ | ||
34 | #define PTP_RXCFG4 0x001d /* PTP Receive Configuration Register 4 */ | ||
35 | #define PTP_TRDL 0x001e /* PTP Temporary Rate Duration Low Register */ | ||
36 | #define PTP_TRDH 0x001f /* PTP Temporary Rate Duration High Register */ | ||
37 | |||
38 | #define PAGE6 0x0006 | ||
39 | #define PTP_COC 0x0014 /* PTP Clock Output Control Register */ | ||
40 | #define PSF_CFG1 0x0015 /* PHY Status Frame Configuration Register 1 */ | ||
41 | #define PSF_CFG2 0x0016 /* PHY Status Frame Configuration Register 2 */ | ||
42 | #define PSF_CFG3 0x0017 /* PHY Status Frame Configuration Register 3 */ | ||
43 | #define PSF_CFG4 0x0018 /* PHY Status Frame Configuration Register 4 */ | ||
44 | #define PTP_SFDCFG 0x0019 /* PTP SFD Configuration Register */ | ||
45 | #define PTP_INTCTL 0x001a /* PTP Interrupt Control Register */ | ||
46 | #define PTP_CLKSRC 0x001b /* PTP Clock Source Register */ | ||
47 | #define PTP_ETR 0x001c /* PTP Ethernet Type Register */ | ||
48 | #define PTP_OFF 0x001d /* PTP Offset Register */ | ||
49 | #define PTP_GPIOMON 0x001e /* PTP GPIO Monitor Register */ | ||
50 | #define PTP_RXHASH 0x001f /* PTP Receive Hash Register */ | ||
51 | |||
52 | /* Bit definitions for the PHYCR2 register */ | ||
53 | #define BC_WRITE (1<<11) /* Broadcast Write Enable */ | ||
54 | |||
55 | /* Bit definitions for the PTP_CTL register */ | ||
56 | #define TRIG_SEL_SHIFT (10) /* PTP Trigger Select */ | ||
57 | #define TRIG_SEL_MASK (0x7) | ||
58 | #define TRIG_DIS (1<<9) /* Disable PTP Trigger */ | ||
59 | #define TRIG_EN (1<<8) /* Enable PTP Trigger */ | ||
60 | #define TRIG_READ (1<<7) /* Read PTP Trigger */ | ||
61 | #define TRIG_LOAD (1<<6) /* Load PTP Trigger */ | ||
62 | #define PTP_RD_CLK (1<<5) /* Read PTP Clock */ | ||
63 | #define PTP_LOAD_CLK (1<<4) /* Load PTP Clock */ | ||
64 | #define PTP_STEP_CLK (1<<3) /* Step PTP Clock */ | ||
65 | #define PTP_ENABLE (1<<2) /* Enable PTP Clock */ | ||
66 | #define PTP_DISABLE (1<<1) /* Disable PTP Clock */ | ||
67 | #define PTP_RESET (1<<0) /* Reset PTP Clock */ | ||
68 | |||
69 | /* Bit definitions for the PTP_STS register */ | ||
70 | #define TXTS_RDY (1<<11) /* Transmit Timestamp Ready */ | ||
71 | #define RXTS_RDY (1<<10) /* Receive Timestamp Ready */ | ||
72 | #define TRIG_DONE (1<<9) /* PTP Trigger Done */ | ||
73 | #define EVENT_RDY (1<<8) /* PTP Event Timestamp Ready */ | ||
74 | #define TXTS_IE (1<<3) /* Transmit Timestamp Interrupt Enable */ | ||
75 | #define RXTS_IE (1<<2) /* Receive Timestamp Interrupt Enable */ | ||
76 | #define TRIG_IE (1<<1) /* Trigger Interrupt Enable */ | ||
77 | #define EVENT_IE (1<<0) /* Event Interrupt Enable */ | ||
78 | |||
79 | /* Bit definitions for the PTP_TSTS register */ | ||
80 | #define TRIG7_ERROR (1<<15) /* Trigger 7 Error */ | ||
81 | #define TRIG7_ACTIVE (1<<14) /* Trigger 7 Active */ | ||
82 | #define TRIG6_ERROR (1<<13) /* Trigger 6 Error */ | ||
83 | #define TRIG6_ACTIVE (1<<12) /* Trigger 6 Active */ | ||
84 | #define TRIG5_ERROR (1<<11) /* Trigger 5 Error */ | ||
85 | #define TRIG5_ACTIVE (1<<10) /* Trigger 5 Active */ | ||
86 | #define TRIG4_ERROR (1<<9) /* Trigger 4 Error */ | ||
87 | #define TRIG4_ACTIVE (1<<8) /* Trigger 4 Active */ | ||
88 | #define TRIG3_ERROR (1<<7) /* Trigger 3 Error */ | ||
89 | #define TRIG3_ACTIVE (1<<6) /* Trigger 3 Active */ | ||
90 | #define TRIG2_ERROR (1<<5) /* Trigger 2 Error */ | ||
91 | #define TRIG2_ACTIVE (1<<4) /* Trigger 2 Active */ | ||
92 | #define TRIG1_ERROR (1<<3) /* Trigger 1 Error */ | ||
93 | #define TRIG1_ACTIVE (1<<2) /* Trigger 1 Active */ | ||
94 | #define TRIG0_ERROR (1<<1) /* Trigger 0 Error */ | ||
95 | #define TRIG0_ACTIVE (1<<0) /* Trigger 0 Active */ | ||
96 | |||
97 | /* Bit definitions for the PTP_RATEH register */ | ||
98 | #define PTP_RATE_DIR (1<<15) /* PTP Rate Direction */ | ||
99 | #define PTP_TMP_RATE (1<<14) /* PTP Temporary Rate */ | ||
100 | #define PTP_RATE_HI_SHIFT (0) /* PTP Rate High 10-bits */ | ||
101 | #define PTP_RATE_HI_MASK (0x3ff) | ||
102 | |||
103 | /* Bit definitions for the PTP_ESTS register */ | ||
104 | #define EVNTS_MISSED_SHIFT (8) /* Indicates number of events missed */ | ||
105 | #define EVNTS_MISSED_MASK (0x7) | ||
106 | #define EVNT_TS_LEN_SHIFT (6) /* Indicates length of the Timestamp field in 16-bit words minus 1 */ | ||
107 | #define EVNT_TS_LEN_MASK (0x3) | ||
108 | #define EVNT_RF (1<<5) /* Indicates whether the event is a rise or falling event */ | ||
109 | #define EVNT_NUM_SHIFT (2) /* Indicates Event Timestamp Unit which detected an event */ | ||
110 | #define EVNT_NUM_MASK (0x7) | ||
111 | #define MULT_EVNT (1<<1) /* Indicates multiple events were detected at the same time */ | ||
112 | #define EVENT_DET (1<<0) /* PTP Event Detected */ | ||
113 | |||
114 | /* Bit definitions for the PTP_EDATA register */ | ||
115 | #define E7_RISE (1<<15) /* Indicates direction of Event 7 */ | ||
116 | #define E7_DET (1<<14) /* Indicates Event 7 detected */ | ||
117 | #define E6_RISE (1<<13) /* Indicates direction of Event 6 */ | ||
118 | #define E6_DET (1<<12) /* Indicates Event 6 detected */ | ||
119 | #define E5_RISE (1<<11) /* Indicates direction of Event 5 */ | ||
120 | #define E5_DET (1<<10) /* Indicates Event 5 detected */ | ||
121 | #define E4_RISE (1<<9) /* Indicates direction of Event 4 */ | ||
122 | #define E4_DET (1<<8) /* Indicates Event 4 detected */ | ||
123 | #define E3_RISE (1<<7) /* Indicates direction of Event 3 */ | ||
124 | #define E3_DET (1<<6) /* Indicates Event 3 detected */ | ||
125 | #define E2_RISE (1<<5) /* Indicates direction of Event 2 */ | ||
126 | #define E2_DET (1<<4) /* Indicates Event 2 detected */ | ||
127 | #define E1_RISE (1<<3) /* Indicates direction of Event 1 */ | ||
128 | #define E1_DET (1<<2) /* Indicates Event 1 detected */ | ||
129 | #define E0_RISE (1<<1) /* Indicates direction of Event 0 */ | ||
130 | #define E0_DET (1<<0) /* Indicates Event 0 detected */ | ||
131 | |||
132 | /* Bit definitions for the PTP_TRIG register */ | ||
133 | #define TRIG_PULSE (1<<15) /* generate a Pulse rather than a single edge */ | ||
134 | #define TRIG_PER (1<<14) /* generate a periodic signal */ | ||
135 | #define TRIG_IF_LATE (1<<13) /* trigger immediately if already past */ | ||
136 | #define TRIG_NOTIFY (1<<12) /* Trigger Notification Enable */ | ||
137 | #define TRIG_GPIO_SHIFT (8) /* Trigger GPIO Connection, value 1-12 */ | ||
138 | #define TRIG_GPIO_MASK (0xf) | ||
139 | #define TRIG_TOGGLE (1<<7) /* Trigger Toggle Mode Enable */ | ||
140 | #define TRIG_CSEL_SHIFT (1) /* Trigger Configuration Select */ | ||
141 | #define TRIG_CSEL_MASK (0x7) | ||
142 | #define TRIG_WR (1<<0) /* Trigger Configuration Write */ | ||
143 | |||
144 | /* Bit definitions for the PTP_EVNT register */ | ||
145 | #define EVNT_RISE (1<<14) /* Event Rise Detect Enable */ | ||
146 | #define EVNT_FALL (1<<13) /* Event Fall Detect Enable */ | ||
147 | #define EVNT_SINGLE (1<<12) /* enable single event capture operation */ | ||
148 | #define EVNT_GPIO_SHIFT (8) /* Event GPIO Connection, value 1-12 */ | ||
149 | #define EVNT_GPIO_MASK (0xf) | ||
150 | #define EVNT_SEL_SHIFT (1) /* Event Select */ | ||
151 | #define EVNT_SEL_MASK (0x7) | ||
152 | #define EVNT_WR (1<<0) /* Event Configuration Write */ | ||
153 | |||
154 | /* Bit definitions for the PTP_TXCFG0 register */ | ||
155 | #define SYNC_1STEP (1<<15) /* insert timestamp into transmit Sync Messages */ | ||
156 | #define DR_INSERT (1<<13) /* Insert Delay_Req Timestamp in Delay_Resp (dangerous) */ | ||
157 | #define NTP_TS_EN (1<<12) /* Enable Timestamping of NTP Packets */ | ||
158 | #define IGNORE_2STEP (1<<11) /* Ignore Two_Step flag for One-Step operation */ | ||
159 | #define CRC_1STEP (1<<10) /* Disable checking of CRC for One-Step operation */ | ||
160 | #define CHK_1STEP (1<<9) /* Enable UDP Checksum correction for One-Step Operation */ | ||
161 | #define IP1588_EN (1<<8) /* Enable IEEE 1588 defined IP address filter */ | ||
162 | #define TX_L2_EN (1<<7) /* Layer2 Timestamp Enable */ | ||
163 | #define TX_IPV6_EN (1<<6) /* IPv6 Timestamp Enable */ | ||
164 | #define TX_IPV4_EN (1<<5) /* IPv4 Timestamp Enable */ | ||
165 | #define TX_PTP_VER_SHIFT (1) /* Enable Timestamp capture for IEEE 1588 version X */ | ||
166 | #define TX_PTP_VER_MASK (0xf) | ||
167 | #define TX_TS_EN (1<<0) /* Transmit Timestamp Enable */ | ||
168 | |||
169 | /* Bit definitions for the PTP_TXCFG1 register */ | ||
170 | #define BYTE0_MASK_SHIFT (8) /* Bit mask to be used for matching Byte0 of the PTP Message */ | ||
171 | #define BYTE0_MASK_MASK (0xff) | ||
172 | #define BYTE0_DATA_SHIFT (0) /* Data to be used for matching Byte0 of the PTP Message */ | ||
173 | #define BYTE0_DATA_MASK (0xff) | ||
174 | |||
175 | /* Bit definitions for the PSF_CFG0 register */ | ||
176 | #define MAC_SRC_ADD_SHIFT (11) /* Status Frame Mac Source Address */ | ||
177 | #define MAC_SRC_ADD_MASK (0x3) | ||
178 | #define MIN_PRE_SHIFT (8) /* Status Frame Minimum Preamble */ | ||
179 | #define MIN_PRE_MASK (0x7) | ||
180 | #define PSF_ENDIAN (1<<7) /* Status Frame Endian Control */ | ||
181 | #define PSF_IPV4 (1<<6) /* Status Frame IPv4 Enable */ | ||
182 | #define PSF_PCF_RD (1<<5) /* Control Frame Read PHY Status Frame Enable */ | ||
183 | #define PSF_ERR_EN (1<<4) /* Error PHY Status Frame Enable */ | ||
184 | #define PSF_TXTS_EN (1<<3) /* Transmit Timestamp PHY Status Frame Enable */ | ||
185 | #define PSF_RXTS_EN (1<<2) /* Receive Timestamp PHY Status Frame Enable */ | ||
186 | #define PSF_TRIG_EN (1<<1) /* Trigger PHY Status Frame Enable */ | ||
187 | #define PSF_EVNT_EN (1<<0) /* Event PHY Status Frame Enable */ | ||
188 | |||
189 | /* Bit definitions for the PTP_RXCFG0 register */ | ||
190 | #define DOMAIN_EN (1<<15) /* Domain Match Enable */ | ||
191 | #define ALT_MAST_DIS (1<<14) /* Alternate Master Timestamp Disable */ | ||
192 | #define USER_IP_SEL (1<<13) /* Selects portion of IP address accessible thru PTP_RXCFG2 */ | ||
193 | #define USER_IP_EN (1<<12) /* Enable User-programmed IP address filter */ | ||
194 | #define RX_SLAVE (1<<11) /* Receive Slave Only */ | ||
195 | #define IP1588_EN_SHIFT (8) /* Enable IEEE 1588 defined IP address filters */ | ||
196 | #define IP1588_EN_MASK (0xf) | ||
197 | #define RX_L2_EN (1<<7) /* Layer2 Timestamp Enable */ | ||
198 | #define RX_IPV6_EN (1<<6) /* IPv6 Timestamp Enable */ | ||
199 | #define RX_IPV4_EN (1<<5) /* IPv4 Timestamp Enable */ | ||
200 | #define RX_PTP_VER_SHIFT (1) /* Enable Timestamp capture for IEEE 1588 version X */ | ||
201 | #define RX_PTP_VER_MASK (0xf) | ||
202 | #define RX_TS_EN (1<<0) /* Receive Timestamp Enable */ | ||
203 | |||
204 | /* Bit definitions for the PTP_RXCFG1 register */ | ||
205 | #define BYTE0_MASK_SHIFT (8) /* Bit mask to be used for matching Byte0 of the PTP Message */ | ||
206 | #define BYTE0_MASK_MASK (0xff) | ||
207 | #define BYTE0_DATA_SHIFT (0) /* Data to be used for matching Byte0 of the PTP Message */ | ||
208 | #define BYTE0_DATA_MASK (0xff) | ||
209 | |||
210 | /* Bit definitions for the PTP_RXCFG3 register */ | ||
211 | #define TS_MIN_IFG_SHIFT (12) /* Minimum Inter-frame Gap */ | ||
212 | #define TS_MIN_IFG_MASK (0xf) | ||
213 | #define ACC_UDP (1<<11) /* Record Timestamp if UDP Checksum Error */ | ||
214 | #define ACC_CRC (1<<10) /* Record Timestamp if CRC Error */ | ||
215 | #define TS_APPEND (1<<9) /* Append Timestamp for L2 */ | ||
216 | #define TS_INSERT (1<<8) /* Enable Timestamp Insertion */ | ||
217 | #define PTP_DOMAIN_SHIFT (0) /* PTP Message domainNumber field */ | ||
218 | #define PTP_DOMAIN_MASK (0xff) | ||
219 | |||
220 | /* Bit definitions for the PTP_RXCFG4 register */ | ||
221 | #define IPV4_UDP_MOD (1<<15) /* Enable IPV4 UDP Modification */ | ||
222 | #define TS_SEC_EN (1<<14) /* Enable Timestamp Seconds */ | ||
223 | #define TS_SEC_LEN_SHIFT (12) /* Inserted Timestamp Seconds Length */ | ||
224 | #define TS_SEC_LEN_MASK (0x3) | ||
225 | #define RXTS_NS_OFF_SHIFT (6) /* Receive Timestamp Nanoseconds offset */ | ||
226 | #define RXTS_NS_OFF_MASK (0x3f) | ||
227 | #define RXTS_SEC_OFF_SHIFT (0) /* Receive Timestamp Seconds offset */ | ||
228 | #define RXTS_SEC_OFF_MASK (0x3f) | ||
229 | |||
230 | /* Bit definitions for the PTP_COC register */ | ||
231 | #define PTP_CLKOUT_EN (1<<15) /* PTP Clock Output Enable */ | ||
232 | #define PTP_CLKOUT_SEL (1<<14) /* PTP Clock Output Source Select */ | ||
233 | #define PTP_CLKOUT_SPEEDSEL (1<<13) /* PTP Clock Output I/O Speed Select */ | ||
234 | #define PTP_CLKDIV_SHIFT (0) /* PTP Clock Divide-by Value */ | ||
235 | #define PTP_CLKDIV_MASK (0xff) | ||
236 | |||
237 | /* Bit definitions for the PSF_CFG1 register */ | ||
238 | #define PTPRESERVED_SHIFT (12) /* PTP v2 reserved field */ | ||
239 | #define PTPRESERVED_MASK (0xf) | ||
240 | #define VERSIONPTP_SHIFT (8) /* PTP v2 versionPTP field */ | ||
241 | #define VERSIONPTP_MASK (0xf) | ||
242 | #define TRANSPORT_SPECIFIC_SHIFT (4) /* PTP v2 Header transportSpecific field */ | ||
243 | #define TRANSPORT_SPECIFIC_MASK (0xf) | ||
244 | #define MESSAGETYPE_SHIFT (0) /* PTP v2 messageType field */ | ||
245 | #define MESSAGETYPE_MASK (0xf) | ||
246 | |||
247 | /* Bit definitions for the PTP_SFDCFG register */ | ||
248 | #define TX_SFD_GPIO_SHIFT (4) /* TX SFD GPIO Select, value 1-12 */ | ||
249 | #define TX_SFD_GPIO_MASK (0xf) | ||
250 | #define RX_SFD_GPIO_SHIFT (0) /* RX SFD GPIO Select, value 1-12 */ | ||
251 | #define RX_SFD_GPIO_MASK (0xf) | ||
252 | |||
253 | /* Bit definitions for the PTP_INTCTL register */ | ||
254 | #define PTP_INT_GPIO_SHIFT (0) /* PTP Interrupt GPIO Select */ | ||
255 | #define PTP_INT_GPIO_MASK (0xf) | ||
256 | |||
257 | /* Bit definitions for the PTP_CLKSRC register */ | ||
258 | #define CLK_SRC_SHIFT (14) /* PTP Clock Source Select */ | ||
259 | #define CLK_SRC_MASK (0x3) | ||
260 | #define CLK_SRC_PER_SHIFT (0) /* PTP Clock Source Period */ | ||
261 | #define CLK_SRC_PER_MASK (0x7f) | ||
262 | |||
263 | /* Bit definitions for the PTP_OFF register */ | ||
264 | #define PTP_OFFSET_SHIFT (0) /* PTP Message offset from preceding header */ | ||
265 | #define PTP_OFFSET_MASK (0xff) | ||
266 | |||
267 | #endif | ||
diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c index a1b82c9c67d..c554a397e55 100644 --- a/drivers/net/ppp_async.c +++ b/drivers/net/ppp_async.c | |||
@@ -523,7 +523,7 @@ static void ppp_async_process(unsigned long arg) | |||
523 | #define PUT_BYTE(ap, buf, c, islcp) do { \ | 523 | #define PUT_BYTE(ap, buf, c, islcp) do { \ |
524 | if ((islcp && c < 0x20) || (ap->xaccm[c >> 5] & (1 << (c & 0x1f)))) {\ | 524 | if ((islcp && c < 0x20) || (ap->xaccm[c >> 5] & (1 << (c & 0x1f)))) {\ |
525 | *buf++ = PPP_ESCAPE; \ | 525 | *buf++ = PPP_ESCAPE; \ |
526 | *buf++ = c ^ 0x20; \ | 526 | *buf++ = c ^ PPP_TRANS; \ |
527 | } else \ | 527 | } else \ |
528 | *buf++ = c; \ | 528 | *buf++ = c; \ |
529 | } while (0) | 529 | } while (0) |
@@ -896,7 +896,7 @@ ppp_async_input(struct asyncppp *ap, const unsigned char *buf, | |||
896 | sp = skb_put(skb, n); | 896 | sp = skb_put(skb, n); |
897 | memcpy(sp, buf, n); | 897 | memcpy(sp, buf, n); |
898 | if (ap->state & SC_ESCAPE) { | 898 | if (ap->state & SC_ESCAPE) { |
899 | sp[0] ^= 0x20; | 899 | sp[0] ^= PPP_TRANS; |
900 | ap->state &= ~SC_ESCAPE; | 900 | ap->state &= ~SC_ESCAPE; |
901 | } | 901 | } |
902 | } | 902 | } |
diff --git a/drivers/net/qlcnic/qlcnic_hw.c b/drivers/net/qlcnic/qlcnic_hw.c index e9656616f2a..a5d9fbf9d81 100644 --- a/drivers/net/qlcnic/qlcnic_hw.c +++ b/drivers/net/qlcnic/qlcnic_hw.c | |||
@@ -1406,6 +1406,7 @@ qlcnic_dump_que(struct qlcnic_adapter *adapter, struct qlcnic_dump_entry *entry, | |||
1406 | 1406 | ||
1407 | for (loop = 0; loop < que->no_ops; loop++) { | 1407 | for (loop = 0; loop < que->no_ops; loop++) { |
1408 | QLCNIC_WR_DUMP_REG(que->sel_addr, base, que_id); | 1408 | QLCNIC_WR_DUMP_REG(que->sel_addr, base, que_id); |
1409 | addr = que->read_addr; | ||
1409 | for (i = 0; i < cnt; i++) { | 1410 | for (i = 0; i < cnt; i++) { |
1410 | QLCNIC_RD_DUMP_REG(addr, base, &data); | 1411 | QLCNIC_RD_DUMP_REG(addr, base, &data); |
1411 | *buffer++ = cpu_to_le32(data); | 1412 | *buffer++ = cpu_to_le32(data); |
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 3ab7d2c7baf..0f6af5c61a7 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -2159,6 +2159,7 @@ qlcnic_unmap_buffers(struct pci_dev *pdev, struct sk_buff *skb, | |||
2159 | 2159 | ||
2160 | nf = &pbuf->frag_array[0]; | 2160 | nf = &pbuf->frag_array[0]; |
2161 | pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE); | 2161 | pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE); |
2162 | pbuf->skb = NULL; | ||
2162 | } | 2163 | } |
2163 | 2164 | ||
2164 | static inline void | 2165 | static inline void |
diff --git a/drivers/net/sfc/mtd.c b/drivers/net/sfc/mtd.c index e646bfce2d8..b6304486f24 100644 --- a/drivers/net/sfc/mtd.c +++ b/drivers/net/sfc/mtd.c | |||
@@ -216,7 +216,7 @@ static void efx_mtd_remove_partition(struct efx_mtd_partition *part) | |||
216 | int rc; | 216 | int rc; |
217 | 217 | ||
218 | for (;;) { | 218 | for (;;) { |
219 | rc = del_mtd_device(&part->mtd); | 219 | rc = mtd_device_unregister(&part->mtd); |
220 | if (rc != -EBUSY) | 220 | if (rc != -EBUSY) |
221 | break; | 221 | break; |
222 | ssleep(1); | 222 | ssleep(1); |
@@ -268,7 +268,7 @@ static int efx_mtd_probe_device(struct efx_nic *efx, struct efx_mtd *efx_mtd) | |||
268 | part->mtd.write = efx_mtd->ops->write; | 268 | part->mtd.write = efx_mtd->ops->write; |
269 | part->mtd.sync = efx_mtd_sync; | 269 | part->mtd.sync = efx_mtd_sync; |
270 | 270 | ||
271 | if (add_mtd_device(&part->mtd)) | 271 | if (mtd_device_register(&part->mtd, NULL, 0)) |
272 | goto fail; | 272 | goto fail; |
273 | } | 273 | } |
274 | 274 | ||
@@ -280,7 +280,7 @@ fail: | |||
280 | --part; | 280 | --part; |
281 | efx_mtd_remove_partition(part); | 281 | efx_mtd_remove_partition(part); |
282 | } | 282 | } |
283 | /* add_mtd_device() returns 1 if the MTD table is full */ | 283 | /* mtd_device_register() returns 1 if the MTD table is full */ |
284 | return -ENOMEM; | 284 | return -ENOMEM; |
285 | } | 285 | } |
286 | 286 | ||
diff --git a/drivers/net/smc-mca.c b/drivers/net/smc-mca.c index 0f29f261fcf..d07c39cb4da 100644 --- a/drivers/net/smc-mca.c +++ b/drivers/net/smc-mca.c | |||
@@ -156,7 +156,7 @@ static const struct { | |||
156 | { 14, 15 } | 156 | { 14, 15 } |
157 | }; | 157 | }; |
158 | 158 | ||
159 | static const short smc_mca_adapter_ids[] __devinitconst = { | 159 | static short smc_mca_adapter_ids[] __initdata = { |
160 | 0x61c8, | 160 | 0x61c8, |
161 | 0x61c9, | 161 | 0x61c9, |
162 | 0x6fc0, | 162 | 0x6fc0, |
@@ -168,7 +168,7 @@ static const short smc_mca_adapter_ids[] __devinitconst = { | |||
168 | 0x0000 | 168 | 0x0000 |
169 | }; | 169 | }; |
170 | 170 | ||
171 | static const char *const smc_mca_adapter_names[] __devinitconst = { | 171 | static char *smc_mca_adapter_names[] __initdata = { |
172 | "SMC Ethercard PLUS Elite/A BNC/AUI (WD8013EP/A)", | 172 | "SMC Ethercard PLUS Elite/A BNC/AUI (WD8013EP/A)", |
173 | "SMC Ethercard PLUS Elite/A UTP/AUI (WD8013WP/A)", | 173 | "SMC Ethercard PLUS Elite/A UTP/AUI (WD8013WP/A)", |
174 | "WD Ethercard PLUS/A (WD8003E/A or WD8003ET/A)", | 174 | "WD Ethercard PLUS/A (WD8003E/A or WD8003ET/A)", |
@@ -199,7 +199,7 @@ static const struct net_device_ops ultramca_netdev_ops = { | |||
199 | #endif | 199 | #endif |
200 | }; | 200 | }; |
201 | 201 | ||
202 | static int __devinit ultramca_probe(struct device *gen_dev) | 202 | static int __init ultramca_probe(struct device *gen_dev) |
203 | { | 203 | { |
204 | unsigned short ioaddr; | 204 | unsigned short ioaddr; |
205 | struct net_device *dev; | 205 | struct net_device *dev; |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index dc4805f473e..f6285748bd3 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
@@ -2400,8 +2400,10 @@ static const struct of_device_id smc91x_match[] = { | |||
2400 | { .compatible = "smsc,lan91c94", }, | 2400 | { .compatible = "smsc,lan91c94", }, |
2401 | { .compatible = "smsc,lan91c111", }, | 2401 | { .compatible = "smsc,lan91c111", }, |
2402 | {}, | 2402 | {}, |
2403 | } | 2403 | }; |
2404 | MODULE_DEVICE_TABLE(of, smc91x_match); | 2404 | MODULE_DEVICE_TABLE(of, smc91x_match); |
2405 | #else | ||
2406 | #define smc91x_match NULL | ||
2405 | #endif | 2407 | #endif |
2406 | 2408 | ||
2407 | static struct dev_pm_ops smc_drv_pm_ops = { | 2409 | static struct dev_pm_ops smc_drv_pm_ops = { |
@@ -2416,9 +2418,7 @@ static struct platform_driver smc_driver = { | |||
2416 | .name = CARDNAME, | 2418 | .name = CARDNAME, |
2417 | .owner = THIS_MODULE, | 2419 | .owner = THIS_MODULE, |
2418 | .pm = &smc_drv_pm_ops, | 2420 | .pm = &smc_drv_pm_ops, |
2419 | #ifdef CONFIG_OF | ||
2420 | .of_match_table = smc91x_match, | 2421 | .of_match_table = smc91x_match, |
2421 | #endif | ||
2422 | }, | 2422 | }, |
2423 | }; | 2423 | }; |
2424 | 2424 | ||
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index f4b01c638a3..a1f9f9eef37 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -5774,7 +5774,7 @@ static void tg3_skb_error_unmap(struct tg3_napi *tnapi, | |||
5774 | dma_unmap_addr(txb, mapping), | 5774 | dma_unmap_addr(txb, mapping), |
5775 | skb_headlen(skb), | 5775 | skb_headlen(skb), |
5776 | PCI_DMA_TODEVICE); | 5776 | PCI_DMA_TODEVICE); |
5777 | for (i = 0; i <= last; i++) { | 5777 | for (i = 0; i < last; i++) { |
5778 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 5778 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
5779 | 5779 | ||
5780 | entry = NEXT_TX(entry); | 5780 | entry = NEXT_TX(entry); |
diff --git a/drivers/net/tile/tilepro.c b/drivers/net/tile/tilepro.c index 1e980fdd9d7..1e2af96fc29 100644 --- a/drivers/net/tile/tilepro.c +++ b/drivers/net/tile/tilepro.c | |||
@@ -1658,11 +1658,9 @@ static int tile_net_stop(struct net_device *dev) | |||
1658 | while (tile_net_lepp_free_comps(dev, true)) | 1658 | while (tile_net_lepp_free_comps(dev, true)) |
1659 | /* loop */; | 1659 | /* loop */; |
1660 | 1660 | ||
1661 | /* Wipe the EPP queue. */ | 1661 | /* Wipe the EPP queue, and wait till the stores hit the EPP. */ |
1662 | memset(priv->eq, 0, sizeof(lepp_queue_t)); | 1662 | memset(priv->eq, 0, sizeof(lepp_queue_t)); |
1663 | 1663 | mb(); | |
1664 | /* Evict the EPP queue. */ | ||
1665 | finv_buffer(priv->eq, EQ_SIZE); | ||
1666 | 1664 | ||
1667 | return 0; | 1665 | return 0; |
1668 | } | 1666 | } |
@@ -2398,7 +2396,7 @@ static void tile_net_cleanup(void) | |||
2398 | struct net_device *dev = tile_net_devs[i]; | 2396 | struct net_device *dev = tile_net_devs[i]; |
2399 | struct tile_net_priv *priv = netdev_priv(dev); | 2397 | struct tile_net_priv *priv = netdev_priv(dev); |
2400 | unregister_netdev(dev); | 2398 | unregister_netdev(dev); |
2401 | finv_buffer(priv->eq, EQ_SIZE); | 2399 | finv_buffer_remote(priv->eq, EQ_SIZE, 0); |
2402 | __free_pages(priv->eq_pages, EQ_ORDER); | 2400 | __free_pages(priv->eq_pages, EQ_ORDER); |
2403 | free_netdev(dev); | 2401 | free_netdev(dev); |
2404 | } | 2402 | } |
diff --git a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c index 1313aa1315f..2bedc0ace81 100644 --- a/drivers/net/tokenring/madgemc.c +++ b/drivers/net/tokenring/madgemc.c | |||
@@ -727,7 +727,7 @@ static int __devexit madgemc_remove(struct device *device) | |||
727 | return 0; | 727 | return 0; |
728 | } | 728 | } |
729 | 729 | ||
730 | static const short madgemc_adapter_ids[] __devinitconst = { | 730 | static short madgemc_adapter_ids[] __initdata = { |
731 | 0x002d, | 731 | 0x002d, |
732 | 0x0000 | 732 | 0x0000 |
733 | }; | 733 | }; |
diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c index 45144d5bd11..efaa1d69b72 100644 --- a/drivers/net/tulip/de4x5.c +++ b/drivers/net/tulip/de4x5.c | |||
@@ -1995,7 +1995,7 @@ SetMulticastFilter(struct net_device *dev) | |||
1995 | 1995 | ||
1996 | static u_char de4x5_irq[] = EISA_ALLOWED_IRQ_LIST; | 1996 | static u_char de4x5_irq[] = EISA_ALLOWED_IRQ_LIST; |
1997 | 1997 | ||
1998 | static int __devinit de4x5_eisa_probe (struct device *gendev) | 1998 | static int __init de4x5_eisa_probe (struct device *gendev) |
1999 | { | 1999 | { |
2000 | struct eisa_device *edev; | 2000 | struct eisa_device *edev; |
2001 | u_long iobase; | 2001 | u_long iobase; |
@@ -2097,7 +2097,7 @@ static int __devexit de4x5_eisa_remove (struct device *device) | |||
2097 | return 0; | 2097 | return 0; |
2098 | } | 2098 | } |
2099 | 2099 | ||
2100 | static const struct eisa_device_id de4x5_eisa_ids[] __devinitconst = { | 2100 | static struct eisa_device_id de4x5_eisa_ids[] = { |
2101 | { "DEC4250", 0 }, /* 0 is the board name index... */ | 2101 | { "DEC4250", 0 }, /* 0 is the board name index... */ |
2102 | { "" } | 2102 | { "" } |
2103 | }; | 2103 | }; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 74e94054ab1..5235f48be1b 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -460,7 +460,23 @@ static u32 tun_net_fix_features(struct net_device *dev, u32 features) | |||
460 | 460 | ||
461 | return (features & tun->set_features) | (features & ~TUN_USER_FEATURES); | 461 | return (features & tun->set_features) | (features & ~TUN_USER_FEATURES); |
462 | } | 462 | } |
463 | 463 | #ifdef CONFIG_NET_POLL_CONTROLLER | |
464 | static void tun_poll_controller(struct net_device *dev) | ||
465 | { | ||
466 | /* | ||
467 | * Tun only receives frames when: | ||
468 | * 1) the char device endpoint gets data from user space | ||
469 | * 2) the tun socket gets a sendmsg call from user space | ||
470 | * Since both of those are syncronous operations, we are guaranteed | ||
471 | * never to have pending data when we poll for it | ||
472 | * so theres nothing to do here but return. | ||
473 | * We need this though so netpoll recognizes us as an interface that | ||
474 | * supports polling, which enables bridge devices in virt setups to | ||
475 | * still use netconsole | ||
476 | */ | ||
477 | return; | ||
478 | } | ||
479 | #endif | ||
464 | static const struct net_device_ops tun_netdev_ops = { | 480 | static const struct net_device_ops tun_netdev_ops = { |
465 | .ndo_uninit = tun_net_uninit, | 481 | .ndo_uninit = tun_net_uninit, |
466 | .ndo_open = tun_net_open, | 482 | .ndo_open = tun_net_open, |
@@ -468,6 +484,9 @@ static const struct net_device_ops tun_netdev_ops = { | |||
468 | .ndo_start_xmit = tun_net_xmit, | 484 | .ndo_start_xmit = tun_net_xmit, |
469 | .ndo_change_mtu = tun_net_change_mtu, | 485 | .ndo_change_mtu = tun_net_change_mtu, |
470 | .ndo_fix_features = tun_net_fix_features, | 486 | .ndo_fix_features = tun_net_fix_features, |
487 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
488 | .ndo_poll_controller = tun_poll_controller, | ||
489 | #endif | ||
471 | }; | 490 | }; |
472 | 491 | ||
473 | static const struct net_device_ops tap_netdev_ops = { | 492 | static const struct net_device_ops tap_netdev_ops = { |
@@ -480,6 +499,9 @@ static const struct net_device_ops tap_netdev_ops = { | |||
480 | .ndo_set_multicast_list = tun_net_mclist, | 499 | .ndo_set_multicast_list = tun_net_mclist, |
481 | .ndo_set_mac_address = eth_mac_addr, | 500 | .ndo_set_mac_address = eth_mac_addr, |
482 | .ndo_validate_addr = eth_validate_addr, | 501 | .ndo_validate_addr = eth_validate_addr, |
502 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
503 | .ndo_poll_controller = tun_poll_controller, | ||
504 | #endif | ||
483 | }; | 505 | }; |
484 | 506 | ||
485 | /* Initialize net device. */ | 507 | /* Initialize net device. */ |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 9d4f9117260..84d4608153c 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -385,6 +385,16 @@ config USB_NET_CX82310_ETH | |||
385 | router with USB ethernet port. This driver is for routers only, | 385 | router with USB ethernet port. This driver is for routers only, |
386 | it will not work with ADSL modems (use cxacru driver instead). | 386 | it will not work with ADSL modems (use cxacru driver instead). |
387 | 387 | ||
388 | config USB_NET_KALMIA | ||
389 | tristate "Samsung Kalmia based LTE USB modem" | ||
390 | depends on USB_USBNET | ||
391 | help | ||
392 | Choose this option if you have a Samsung Kalmia based USB modem | ||
393 | as Samsung GT-B3730. | ||
394 | |||
395 | To compile this driver as a module, choose M here: the | ||
396 | module will be called kalmia. | ||
397 | |||
388 | config USB_HSO | 398 | config USB_HSO |
389 | tristate "Option USB High Speed Mobile Devices" | 399 | tristate "Option USB High Speed Mobile Devices" |
390 | depends on USB && RFKILL | 400 | depends on USB && RFKILL |
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile index c7ec8a5f0a9..c203fa21f6b 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile | |||
@@ -23,6 +23,7 @@ obj-$(CONFIG_USB_NET_MCS7830) += mcs7830.o | |||
23 | obj-$(CONFIG_USB_USBNET) += usbnet.o | 23 | obj-$(CONFIG_USB_USBNET) += usbnet.o |
24 | obj-$(CONFIG_USB_NET_INT51X1) += int51x1.o | 24 | obj-$(CONFIG_USB_NET_INT51X1) += int51x1.o |
25 | obj-$(CONFIG_USB_CDC_PHONET) += cdc-phonet.o | 25 | obj-$(CONFIG_USB_CDC_PHONET) += cdc-phonet.o |
26 | obj-$(CONFIG_USB_NET_KALMIA) += kalmia.o | ||
26 | obj-$(CONFIG_USB_IPHETH) += ipheth.o | 27 | obj-$(CONFIG_USB_IPHETH) += ipheth.o |
27 | obj-$(CONFIG_USB_SIERRA_NET) += sierra_net.o | 28 | obj-$(CONFIG_USB_SIERRA_NET) += sierra_net.o |
28 | obj-$(CONFIG_USB_NET_CX82310_ETH) += cx82310_eth.o | 29 | obj-$(CONFIG_USB_NET_CX82310_ETH) += cx82310_eth.o |
diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c index d7221c4a5dc..8056f8a27c6 100644 --- a/drivers/net/usb/catc.c +++ b/drivers/net/usb/catc.c | |||
@@ -495,7 +495,7 @@ static void catc_ctrl_run(struct catc *catc) | |||
495 | if (!q->dir && q->buf && q->len) | 495 | if (!q->dir && q->buf && q->len) |
496 | memcpy(catc->ctrl_buf, q->buf, q->len); | 496 | memcpy(catc->ctrl_buf, q->buf, q->len); |
497 | 497 | ||
498 | if ((status = usb_submit_urb(catc->ctrl_urb, GFP_KERNEL))) | 498 | if ((status = usb_submit_urb(catc->ctrl_urb, GFP_ATOMIC))) |
499 | err("submit(ctrl_urb) status %d", status); | 499 | err("submit(ctrl_urb) status %d", status); |
500 | } | 500 | } |
501 | 501 | ||
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index cdd3ae48610..f33ca6aa29e 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -54,7 +54,7 @@ | |||
54 | #include <linux/usb/usbnet.h> | 54 | #include <linux/usb/usbnet.h> |
55 | #include <linux/usb/cdc.h> | 55 | #include <linux/usb/cdc.h> |
56 | 56 | ||
57 | #define DRIVER_VERSION "24-May-2011" | 57 | #define DRIVER_VERSION "01-June-2011" |
58 | 58 | ||
59 | /* CDC NCM subclass 3.2.1 */ | 59 | /* CDC NCM subclass 3.2.1 */ |
60 | #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 | 60 | #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 |
@@ -1234,6 +1234,7 @@ static struct usb_driver cdc_ncm_driver = { | |||
1234 | .disconnect = cdc_ncm_disconnect, | 1234 | .disconnect = cdc_ncm_disconnect, |
1235 | .suspend = usbnet_suspend, | 1235 | .suspend = usbnet_suspend, |
1236 | .resume = usbnet_resume, | 1236 | .resume = usbnet_resume, |
1237 | .reset_resume = usbnet_resume, | ||
1237 | .supports_autosuspend = 1, | 1238 | .supports_autosuspend = 1, |
1238 | }; | 1239 | }; |
1239 | 1240 | ||
diff --git a/drivers/net/usb/kalmia.c b/drivers/net/usb/kalmia.c new file mode 100644 index 00000000000..d965fb1e013 --- /dev/null +++ b/drivers/net/usb/kalmia.c | |||
@@ -0,0 +1,384 @@ | |||
1 | /* | ||
2 | * USB network interface driver for Samsung Kalmia based LTE USB modem like the | ||
3 | * Samsung GT-B3730 and GT-B3710. | ||
4 | * | ||
5 | * Copyright (C) 2011 Marius Bjoernstad Kotsbak <marius@kotsbak.com> | ||
6 | * | ||
7 | * Sponsored by Quicklink Video Distribution Services Ltd. | ||
8 | * | ||
9 | * Based on the cdc_eem module. | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | */ | ||
16 | |||
17 | #include <linux/module.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/netdevice.h> | ||
20 | #include <linux/etherdevice.h> | ||
21 | #include <linux/ctype.h> | ||
22 | #include <linux/ethtool.h> | ||
23 | #include <linux/workqueue.h> | ||
24 | #include <linux/mii.h> | ||
25 | #include <linux/usb.h> | ||
26 | #include <linux/crc32.h> | ||
27 | #include <linux/usb/cdc.h> | ||
28 | #include <linux/usb/usbnet.h> | ||
29 | #include <linux/gfp.h> | ||
30 | |||
31 | /* | ||
32 | * The Samsung Kalmia based LTE USB modems have a CDC ACM port for modem control | ||
33 | * handled by the "option" module and an ethernet data port handled by this | ||
34 | * module. | ||
35 | * | ||
36 | * The stick must first be switched into modem mode by usb_modeswitch | ||
37 | * or similar tool. Then the modem gets sent two initialization packets by | ||
38 | * this module, which gives the MAC address of the device. User space can then | ||
39 | * connect the modem using AT commands through the ACM port and then use | ||
40 | * DHCP on the network interface exposed by this module. Network packets are | ||
41 | * sent to and from the modem in a proprietary format discovered after watching | ||
42 | * the behavior of the windows driver for the modem. | ||
43 | * | ||
44 | * More information about the use of the modem is available in usb_modeswitch | ||
45 | * forum and the project page: | ||
46 | * | ||
47 | * http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?t=465 | ||
48 | * https://github.com/mkotsbak/Samsung-GT-B3730-linux-driver | ||
49 | */ | ||
50 | |||
51 | /* #define DEBUG */ | ||
52 | /* #define VERBOSE */ | ||
53 | |||
54 | #define KALMIA_HEADER_LENGTH 6 | ||
55 | #define KALMIA_ALIGN_SIZE 4 | ||
56 | #define KALMIA_USB_TIMEOUT 10000 | ||
57 | |||
58 | /*-------------------------------------------------------------------------*/ | ||
59 | |||
60 | static int | ||
61 | kalmia_send_init_packet(struct usbnet *dev, u8 *init_msg, u8 init_msg_len, | ||
62 | u8 *buffer, u8 expected_len) | ||
63 | { | ||
64 | int act_len; | ||
65 | int status; | ||
66 | |||
67 | netdev_dbg(dev->net, "Sending init packet"); | ||
68 | |||
69 | status = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 0x02), | ||
70 | init_msg, init_msg_len, &act_len, KALMIA_USB_TIMEOUT); | ||
71 | if (status != 0) { | ||
72 | netdev_err(dev->net, | ||
73 | "Error sending init packet. Status %i, length %i\n", | ||
74 | status, act_len); | ||
75 | return status; | ||
76 | } | ||
77 | else if (act_len != init_msg_len) { | ||
78 | netdev_err(dev->net, | ||
79 | "Did not send all of init packet. Bytes sent: %i", | ||
80 | act_len); | ||
81 | } | ||
82 | else { | ||
83 | netdev_dbg(dev->net, "Successfully sent init packet."); | ||
84 | } | ||
85 | |||
86 | status = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, 0x81), | ||
87 | buffer, expected_len, &act_len, KALMIA_USB_TIMEOUT); | ||
88 | |||
89 | if (status != 0) | ||
90 | netdev_err(dev->net, | ||
91 | "Error receiving init result. Status %i, length %i\n", | ||
92 | status, act_len); | ||
93 | else if (act_len != expected_len) | ||
94 | netdev_err(dev->net, "Unexpected init result length: %i\n", | ||
95 | act_len); | ||
96 | |||
97 | return status; | ||
98 | } | ||
99 | |||
100 | static int | ||
101 | kalmia_init_and_get_ethernet_addr(struct usbnet *dev, u8 *ethernet_addr) | ||
102 | { | ||
103 | char init_msg_1[] = | ||
104 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, | ||
105 | 0x00, 0x00 }; | ||
106 | char init_msg_2[] = | ||
107 | { 0x57, 0x50, 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf4, | ||
108 | 0x00, 0x00 }; | ||
109 | char receive_buf[28]; | ||
110 | int status; | ||
111 | |||
112 | status = kalmia_send_init_packet(dev, init_msg_1, sizeof(init_msg_1) | ||
113 | / sizeof(init_msg_1[0]), receive_buf, 24); | ||
114 | if (status != 0) | ||
115 | return status; | ||
116 | |||
117 | status = kalmia_send_init_packet(dev, init_msg_2, sizeof(init_msg_2) | ||
118 | / sizeof(init_msg_2[0]), receive_buf, 28); | ||
119 | if (status != 0) | ||
120 | return status; | ||
121 | |||
122 | memcpy(ethernet_addr, receive_buf + 10, ETH_ALEN); | ||
123 | |||
124 | return status; | ||
125 | } | ||
126 | |||
127 | static int | ||
128 | kalmia_bind(struct usbnet *dev, struct usb_interface *intf) | ||
129 | { | ||
130 | u8 status; | ||
131 | u8 ethernet_addr[ETH_ALEN]; | ||
132 | |||
133 | /* Don't bind to AT command interface */ | ||
134 | if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) | ||
135 | return -EINVAL; | ||
136 | |||
137 | dev->in = usb_rcvbulkpipe(dev->udev, 0x81 & USB_ENDPOINT_NUMBER_MASK); | ||
138 | dev->out = usb_sndbulkpipe(dev->udev, 0x02 & USB_ENDPOINT_NUMBER_MASK); | ||
139 | dev->status = NULL; | ||
140 | |||
141 | dev->net->hard_header_len += KALMIA_HEADER_LENGTH; | ||
142 | dev->hard_mtu = 1400; | ||
143 | dev->rx_urb_size = dev->hard_mtu * 10; // Found as optimal after testing | ||
144 | |||
145 | status = kalmia_init_and_get_ethernet_addr(dev, ethernet_addr); | ||
146 | |||
147 | if (status < 0) { | ||
148 | usb_set_intfdata(intf, NULL); | ||
149 | usb_driver_release_interface(driver_of(intf), intf); | ||
150 | return status; | ||
151 | } | ||
152 | |||
153 | memcpy(dev->net->dev_addr, ethernet_addr, ETH_ALEN); | ||
154 | memcpy(dev->net->perm_addr, ethernet_addr, ETH_ALEN); | ||
155 | |||
156 | return status; | ||
157 | } | ||
158 | |||
159 | static struct sk_buff * | ||
160 | kalmia_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | ||
161 | { | ||
162 | struct sk_buff *skb2 = NULL; | ||
163 | u16 content_len; | ||
164 | unsigned char *header_start; | ||
165 | unsigned char ether_type_1, ether_type_2; | ||
166 | u8 remainder, padlen = 0; | ||
167 | |||
168 | if (!skb_cloned(skb)) { | ||
169 | int headroom = skb_headroom(skb); | ||
170 | int tailroom = skb_tailroom(skb); | ||
171 | |||
172 | if ((tailroom >= KALMIA_ALIGN_SIZE) && (headroom | ||
173 | >= KALMIA_HEADER_LENGTH)) | ||
174 | goto done; | ||
175 | |||
176 | if ((headroom + tailroom) > (KALMIA_HEADER_LENGTH | ||
177 | + KALMIA_ALIGN_SIZE)) { | ||
178 | skb->data = memmove(skb->head + KALMIA_HEADER_LENGTH, | ||
179 | skb->data, skb->len); | ||
180 | skb_set_tail_pointer(skb, skb->len); | ||
181 | goto done; | ||
182 | } | ||
183 | } | ||
184 | |||
185 | skb2 = skb_copy_expand(skb, KALMIA_HEADER_LENGTH, | ||
186 | KALMIA_ALIGN_SIZE, flags); | ||
187 | if (!skb2) | ||
188 | return NULL; | ||
189 | |||
190 | dev_kfree_skb_any(skb); | ||
191 | skb = skb2; | ||
192 | |||
193 | done: header_start = skb_push(skb, KALMIA_HEADER_LENGTH); | ||
194 | ether_type_1 = header_start[KALMIA_HEADER_LENGTH + 12]; | ||
195 | ether_type_2 = header_start[KALMIA_HEADER_LENGTH + 13]; | ||
196 | |||
197 | netdev_dbg(dev->net, "Sending etherType: %02x%02x", ether_type_1, | ||
198 | ether_type_2); | ||
199 | |||
200 | /* According to empiric data for data packages */ | ||
201 | header_start[0] = 0x57; | ||
202 | header_start[1] = 0x44; | ||
203 | content_len = skb->len - KALMIA_HEADER_LENGTH; | ||
204 | header_start[2] = (content_len & 0xff); /* low byte */ | ||
205 | header_start[3] = (content_len >> 8); /* high byte */ | ||
206 | |||
207 | header_start[4] = ether_type_1; | ||
208 | header_start[5] = ether_type_2; | ||
209 | |||
210 | /* Align to 4 bytes by padding with zeros */ | ||
211 | remainder = skb->len % KALMIA_ALIGN_SIZE; | ||
212 | if (remainder > 0) { | ||
213 | padlen = KALMIA_ALIGN_SIZE - remainder; | ||
214 | memset(skb_put(skb, padlen), 0, padlen); | ||
215 | } | ||
216 | |||
217 | netdev_dbg( | ||
218 | dev->net, | ||
219 | "Sending package with length %i and padding %i. Header: %02x:%02x:%02x:%02x:%02x:%02x.", | ||
220 | content_len, padlen, header_start[0], header_start[1], | ||
221 | header_start[2], header_start[3], header_start[4], | ||
222 | header_start[5]); | ||
223 | |||
224 | return skb; | ||
225 | } | ||
226 | |||
227 | static int | ||
228 | kalmia_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
229 | { | ||
230 | /* | ||
231 | * Our task here is to strip off framing, leaving skb with one | ||
232 | * data frame for the usbnet framework code to process. | ||
233 | */ | ||
234 | const u8 HEADER_END_OF_USB_PACKET[] = | ||
235 | { 0x57, 0x5a, 0x00, 0x00, 0x08, 0x00 }; | ||
236 | const u8 EXPECTED_UNKNOWN_HEADER_1[] = | ||
237 | { 0x57, 0x43, 0x1e, 0x00, 0x15, 0x02 }; | ||
238 | const u8 EXPECTED_UNKNOWN_HEADER_2[] = | ||
239 | { 0x57, 0x50, 0x0e, 0x00, 0x00, 0x00 }; | ||
240 | u8 i = 0; | ||
241 | |||
242 | /* incomplete header? */ | ||
243 | if (skb->len < KALMIA_HEADER_LENGTH) | ||
244 | return 0; | ||
245 | |||
246 | do { | ||
247 | struct sk_buff *skb2 = NULL; | ||
248 | u8 *header_start; | ||
249 | u16 usb_packet_length, ether_packet_length; | ||
250 | int is_last; | ||
251 | |||
252 | header_start = skb->data; | ||
253 | |||
254 | if (unlikely(header_start[0] != 0x57 || header_start[1] != 0x44)) { | ||
255 | if (!memcmp(header_start, EXPECTED_UNKNOWN_HEADER_1, | ||
256 | sizeof(EXPECTED_UNKNOWN_HEADER_1)) || !memcmp( | ||
257 | header_start, EXPECTED_UNKNOWN_HEADER_2, | ||
258 | sizeof(EXPECTED_UNKNOWN_HEADER_2))) { | ||
259 | netdev_dbg( | ||
260 | dev->net, | ||
261 | "Received expected unknown frame header: %02x:%02x:%02x:%02x:%02x:%02x. Package length: %i\n", | ||
262 | header_start[0], header_start[1], | ||
263 | header_start[2], header_start[3], | ||
264 | header_start[4], header_start[5], | ||
265 | skb->len - KALMIA_HEADER_LENGTH); | ||
266 | } | ||
267 | else { | ||
268 | netdev_err( | ||
269 | dev->net, | ||
270 | "Received unknown frame header: %02x:%02x:%02x:%02x:%02x:%02x. Package length: %i\n", | ||
271 | header_start[0], header_start[1], | ||
272 | header_start[2], header_start[3], | ||
273 | header_start[4], header_start[5], | ||
274 | skb->len - KALMIA_HEADER_LENGTH); | ||
275 | return 0; | ||
276 | } | ||
277 | } | ||
278 | else | ||
279 | netdev_dbg( | ||
280 | dev->net, | ||
281 | "Received header: %02x:%02x:%02x:%02x:%02x:%02x. Package length: %i\n", | ||
282 | header_start[0], header_start[1], header_start[2], | ||
283 | header_start[3], header_start[4], header_start[5], | ||
284 | skb->len - KALMIA_HEADER_LENGTH); | ||
285 | |||
286 | /* subtract start header and end header */ | ||
287 | usb_packet_length = skb->len - (2 * KALMIA_HEADER_LENGTH); | ||
288 | ether_packet_length = header_start[2] + (header_start[3] << 8); | ||
289 | skb_pull(skb, KALMIA_HEADER_LENGTH); | ||
290 | |||
291 | /* Some small packets misses end marker */ | ||
292 | if (usb_packet_length < ether_packet_length) { | ||
293 | ether_packet_length = usb_packet_length | ||
294 | + KALMIA_HEADER_LENGTH; | ||
295 | is_last = true; | ||
296 | } | ||
297 | else { | ||
298 | netdev_dbg(dev->net, "Correct package length #%i", i | ||
299 | + 1); | ||
300 | |||
301 | is_last = (memcmp(skb->data + ether_packet_length, | ||
302 | HEADER_END_OF_USB_PACKET, | ||
303 | sizeof(HEADER_END_OF_USB_PACKET)) == 0); | ||
304 | if (!is_last) { | ||
305 | header_start = skb->data + ether_packet_length; | ||
306 | netdev_dbg( | ||
307 | dev->net, | ||
308 | "End header: %02x:%02x:%02x:%02x:%02x:%02x. Package length: %i\n", | ||
309 | header_start[0], header_start[1], | ||
310 | header_start[2], header_start[3], | ||
311 | header_start[4], header_start[5], | ||
312 | skb->len - KALMIA_HEADER_LENGTH); | ||
313 | } | ||
314 | } | ||
315 | |||
316 | if (is_last) { | ||
317 | skb2 = skb; | ||
318 | } | ||
319 | else { | ||
320 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
321 | if (unlikely(!skb2)) | ||
322 | return 0; | ||
323 | } | ||
324 | |||
325 | skb_trim(skb2, ether_packet_length); | ||
326 | |||
327 | if (is_last) { | ||
328 | return 1; | ||
329 | } | ||
330 | else { | ||
331 | usbnet_skb_return(dev, skb2); | ||
332 | skb_pull(skb, ether_packet_length); | ||
333 | } | ||
334 | |||
335 | i++; | ||
336 | } | ||
337 | while (skb->len); | ||
338 | |||
339 | return 1; | ||
340 | } | ||
341 | |||
342 | static const struct driver_info kalmia_info = { | ||
343 | .description = "Samsung Kalmia LTE USB dongle", | ||
344 | .flags = FLAG_WWAN, | ||
345 | .bind = kalmia_bind, | ||
346 | .rx_fixup = kalmia_rx_fixup, | ||
347 | .tx_fixup = kalmia_tx_fixup | ||
348 | }; | ||
349 | |||
350 | /*-------------------------------------------------------------------------*/ | ||
351 | |||
352 | static const struct usb_device_id products[] = { | ||
353 | /* The unswitched USB ID, to get the module auto loaded: */ | ||
354 | { USB_DEVICE(0x04e8, 0x689a) }, | ||
355 | /* The stick swithed into modem (by e.g. usb_modeswitch): */ | ||
356 | { USB_DEVICE(0x04e8, 0x6889), | ||
357 | .driver_info = (unsigned long) &kalmia_info, }, | ||
358 | { /* EMPTY == end of list */} }; | ||
359 | MODULE_DEVICE_TABLE( usb, products); | ||
360 | |||
361 | static struct usb_driver kalmia_driver = { | ||
362 | .name = "kalmia", | ||
363 | .id_table = products, | ||
364 | .probe = usbnet_probe, | ||
365 | .disconnect = usbnet_disconnect, | ||
366 | .suspend = usbnet_suspend, | ||
367 | .resume = usbnet_resume | ||
368 | }; | ||
369 | |||
370 | static int __init kalmia_init(void) | ||
371 | { | ||
372 | return usb_register(&kalmia_driver); | ||
373 | } | ||
374 | module_init( kalmia_init); | ||
375 | |||
376 | static void __exit kalmia_exit(void) | ||
377 | { | ||
378 | usb_deregister(&kalmia_driver); | ||
379 | } | ||
380 | module_exit( kalmia_exit); | ||
381 | |||
382 | MODULE_AUTHOR("Marius Bjoernstad Kotsbak <marius@kotsbak.com>"); | ||
383 | MODULE_DESCRIPTION("Samsung Kalmia USB network driver"); | ||
384 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 0cb0b063267..f6853247a62 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -609,7 +609,7 @@ static netdev_tx_t start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
609 | * before it gets out of hand. Naturally, this wastes entries. */ | 609 | * before it gets out of hand. Naturally, this wastes entries. */ |
610 | if (capacity < 2+MAX_SKB_FRAGS) { | 610 | if (capacity < 2+MAX_SKB_FRAGS) { |
611 | netif_stop_queue(dev); | 611 | netif_stop_queue(dev); |
612 | if (unlikely(!virtqueue_enable_cb(vi->svq))) { | 612 | if (unlikely(!virtqueue_enable_cb_delayed(vi->svq))) { |
613 | /* More just got used, free them then recheck. */ | 613 | /* More just got used, free them then recheck. */ |
614 | capacity += free_old_xmit_skbs(vi); | 614 | capacity += free_old_xmit_skbs(vi); |
615 | if (capacity >= 2+MAX_SKB_FRAGS) { | 615 | if (capacity >= 2+MAX_SKB_FRAGS) { |
diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index 737b59f1a8d..9617d3d0ee3 100644 --- a/drivers/net/wan/pc300_drv.c +++ b/drivers/net/wan/pc300_drv.c | |||
@@ -3242,8 +3242,7 @@ static inline void show_version(void) | |||
3242 | rcsdate++; | 3242 | rcsdate++; |
3243 | tmp = strrchr(rcsdate, ' '); | 3243 | tmp = strrchr(rcsdate, ' '); |
3244 | *tmp = '\0'; | 3244 | *tmp = '\0'; |
3245 | printk(KERN_INFO "Cyclades-PC300 driver %s %s (built %s %s)\n", | 3245 | printk(KERN_INFO "Cyclades-PC300 driver %s %s\n", rcsvers, rcsdate); |
3246 | rcsvers, rcsdate, __DATE__, __TIME__); | ||
3247 | } /* show_version */ | 3246 | } /* show_version */ |
3248 | 3247 | ||
3249 | static const struct net_device_ops cpc_netdev_ops = { | 3248 | static const struct net_device_ops cpc_netdev_ops = { |
diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c index df2484d4547..c983c10e0f6 100644 --- a/drivers/net/wireless/airo_cs.c +++ b/drivers/net/wireless/airo_cs.c | |||
@@ -164,7 +164,7 @@ static int airo_resume(struct pcmcia_device *link) | |||
164 | return 0; | 164 | return 0; |
165 | } | 165 | } |
166 | 166 | ||
167 | static struct pcmcia_device_id airo_ids[] = { | 167 | static const struct pcmcia_device_id airo_ids[] = { |
168 | PCMCIA_DEVICE_MANF_CARD(0x015f, 0x000a), | 168 | PCMCIA_DEVICE_MANF_CARD(0x015f, 0x000a), |
169 | PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0005), | 169 | PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0005), |
170 | PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0007), | 170 | PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0007), |
diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c index 05263516c11..ec295c4f677 100644 --- a/drivers/net/wireless/atmel_cs.c +++ b/drivers/net/wireless/atmel_cs.c | |||
@@ -122,7 +122,7 @@ static int atmel_config(struct pcmcia_device *link) | |||
122 | { | 122 | { |
123 | local_info_t *dev; | 123 | local_info_t *dev; |
124 | int ret; | 124 | int ret; |
125 | struct pcmcia_device_id *did; | 125 | const struct pcmcia_device_id *did; |
126 | 126 | ||
127 | dev = link->priv; | 127 | dev = link->priv; |
128 | did = dev_get_drvdata(&link->dev); | 128 | did = dev_get_drvdata(&link->dev); |
@@ -211,7 +211,7 @@ static int atmel_resume(struct pcmcia_device *link) | |||
211 | .prod_id_hash = { (vh1), (vh2), 0, 0 }, \ | 211 | .prod_id_hash = { (vh1), (vh2), 0, 0 }, \ |
212 | .driver_info = (kernel_ulong_t)(info), } | 212 | .driver_info = (kernel_ulong_t)(info), } |
213 | 213 | ||
214 | static struct pcmcia_device_id atmel_ids[] = { | 214 | static const struct pcmcia_device_id atmel_ids[] = { |
215 | PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0620, ATMEL_FW_TYPE_502_3COM), | 215 | PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0620, ATMEL_FW_TYPE_502_3COM), |
216 | PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0696, ATMEL_FW_TYPE_502_3COM), | 216 | PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0696, ATMEL_FW_TYPE_502_3COM), |
217 | PCMCIA_DEVICE_MANF_CARD_INFO(0x01bf, 0x3302, ATMEL_FW_TYPE_502E), | 217 | PCMCIA_DEVICE_MANF_CARD_INFO(0x01bf, 0x3302, ATMEL_FW_TYPE_502E), |
diff --git a/drivers/net/wireless/b43/pcmcia.c b/drivers/net/wireless/b43/pcmcia.c index 7dcba5fafdc..2c8461dcf1b 100644 --- a/drivers/net/wireless/b43/pcmcia.c +++ b/drivers/net/wireless/b43/pcmcia.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <pcmcia/cisreg.h> | 32 | #include <pcmcia/cisreg.h> |
33 | 33 | ||
34 | 34 | ||
35 | static /*const */ struct pcmcia_device_id b43_pcmcia_tbl[] = { | 35 | static const struct pcmcia_device_id b43_pcmcia_tbl[] = { |
36 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448), | 36 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448), |
37 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476), | 37 | PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x476), |
38 | PCMCIA_DEVICE_NULL, | 38 | PCMCIA_DEVICE_NULL, |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 2176edede39..c052a0d5cbd 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -620,7 +620,7 @@ static int hostap_cs_resume(struct pcmcia_device *link) | |||
620 | return 0; | 620 | return 0; |
621 | } | 621 | } |
622 | 622 | ||
623 | static struct pcmcia_device_id hostap_cs_ids[] = { | 623 | static const struct pcmcia_device_id hostap_cs_ids[] = { |
624 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), | 624 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), |
625 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), | 625 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), |
626 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), | 626 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), |
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index 63ed5798365..e2693517986 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
@@ -983,7 +983,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev) | |||
983 | /* Module initialization */ | 983 | /* Module initialization */ |
984 | /********************************************************************/ | 984 | /********************************************************************/ |
985 | 985 | ||
986 | static struct pcmcia_device_id if_cs_ids[] = { | 986 | static const struct pcmcia_device_id if_cs_ids[] = { |
987 | PCMCIA_DEVICE_MANF_CARD(CF8305_MANFID, CF8305_CARDID), | 987 | PCMCIA_DEVICE_MANF_CARD(CF8305_MANFID, CF8305_CARDID), |
988 | PCMCIA_DEVICE_MANF_CARD(CF8381_MANFID, CF8381_CARDID), | 988 | PCMCIA_DEVICE_MANF_CARD(CF8381_MANFID, CF8381_CARDID), |
989 | PCMCIA_DEVICE_MANF_CARD(CF8385_MANFID, CF8385_CARDID), | 989 | PCMCIA_DEVICE_MANF_CARD(CF8385_MANFID, CF8385_CARDID), |
diff --git a/drivers/net/wireless/orinoco/orinoco_cs.c b/drivers/net/wireless/orinoco/orinoco_cs.c index 32954c4b243..88e3c0ebcaa 100644 --- a/drivers/net/wireless/orinoco/orinoco_cs.c +++ b/drivers/net/wireless/orinoco/orinoco_cs.c | |||
@@ -237,7 +237,7 @@ static int orinoco_cs_resume(struct pcmcia_device *link) | |||
237 | /* Module initialization */ | 237 | /* Module initialization */ |
238 | /********************************************************************/ | 238 | /********************************************************************/ |
239 | 239 | ||
240 | static struct pcmcia_device_id orinoco_cs_ids[] = { | 240 | static const struct pcmcia_device_id orinoco_cs_ids[] = { |
241 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), /* 3Com AirConnect PCI 777A */ | 241 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), /* 3Com AirConnect PCI 777A */ |
242 | PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), /* Lucent Orinoco and old Intersil */ | 242 | PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), /* Lucent Orinoco and old Intersil */ |
243 | PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), /* Ericsson WLAN Card C11 */ | 243 | PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), /* Ericsson WLAN Card C11 */ |
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c index db34c282e59..81f3673d31d 100644 --- a/drivers/net/wireless/orinoco/spectrum_cs.c +++ b/drivers/net/wireless/orinoco/spectrum_cs.c | |||
@@ -301,7 +301,7 @@ spectrum_cs_resume(struct pcmcia_device *link) | |||
301 | /* Module initialization */ | 301 | /* Module initialization */ |
302 | /********************************************************************/ | 302 | /********************************************************************/ |
303 | 303 | ||
304 | static struct pcmcia_device_id spectrum_cs_ids[] = { | 304 | static const struct pcmcia_device_id spectrum_cs_ids[] = { |
305 | PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4137 */ | 305 | PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4137 */ |
306 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0001), /* Socket Communications CF */ | 306 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0001), /* Socket Communications CF */ |
307 | PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless LAN PC Card", 0x816cc815, 0x6fbf459a), /* 2011B, not 2011 */ | 307 | PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless LAN PC Card", 0x816cc815, 0x6fbf459a), /* 2011B, not 2011 */ |
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 0764d1a30d1..2a06ebcd67c 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c | |||
@@ -2781,7 +2781,7 @@ static const struct file_operations int_proc_fops = { | |||
2781 | }; | 2781 | }; |
2782 | #endif | 2782 | #endif |
2783 | 2783 | ||
2784 | static struct pcmcia_device_id ray_ids[] = { | 2784 | static const struct pcmcia_device_id ray_ids[] = { |
2785 | PCMCIA_DEVICE_MANF_CARD(0x01a6, 0x0000), | 2785 | PCMCIA_DEVICE_MANF_CARD(0x01a6, 0x0000), |
2786 | PCMCIA_DEVICE_NULL, | 2786 | PCMCIA_DEVICE_NULL, |
2787 | }; | 2787 | }; |
diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c index fc08f36fe1f..6bc7c92fbff 100644 --- a/drivers/net/wireless/wl3501_cs.c +++ b/drivers/net/wireless/wl3501_cs.c | |||
@@ -2000,7 +2000,7 @@ static int wl3501_resume(struct pcmcia_device *link) | |||
2000 | } | 2000 | } |
2001 | 2001 | ||
2002 | 2002 | ||
2003 | static struct pcmcia_device_id wl3501_ids[] = { | 2003 | static const struct pcmcia_device_id wl3501_ids[] = { |
2004 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0001), | 2004 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0001), |
2005 | PCMCIA_DEVICE_NULL | 2005 | PCMCIA_DEVICE_NULL |
2006 | }; | 2006 | }; |