aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-13 20:27:40 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-13 20:27:40 -0400
commitf0094b28f3038936c1985be64dbe83f0e950b671 (patch)
treec3a61d5583cc2b39f65ef3b01e6660696b359656
parent13b102bf48d39d84d87bee31544f4588502649b6 (diff)
parent61dac43ee6bedd8507294c7af8959157b686c221 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "Several networking final fixes and tidies for the merge window: 1) Changes during the merge window unintentionally took away the ability to build bluetooth modular, fix from Geert Uytterhoeven. 2) Several phy_node reference count bug fixes from Uwe Kleine-König. 3) Fix ucc_geth build failures, also from Uwe Kleine-König. 4) Fix klog false positivies when netlink messages go to network taps, by properly resetting the network header. Fix from Daniel Borkmann. 5) Sizing estimate of VF netlink messages is too small, from Jiri Benc. 6) New APM X-Gene SoC ethernet driver, from Iyappan Subramanian. 7) VLAN untagging is erroneously dependent upon whether the VLAN module is loaded or not, but there are generic dependencies that matter wrt what can be expected as the SKB enters the stack. Make the basic untagging generic code, and do it unconditionally. From Vlad Yasevich. 8) xen-netfront only has so many slots in it's transmit queue so linearize packets that have too many frags. From Zoltan Kiss. 9) Fix suspend/resume PHY handling in bcmgenet driver, from Florian Fainelli" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (55 commits) net: bcmgenet: correctly resume adapter from Wake-on-LAN net: bcmgenet: update UMAC_CMD only when link is detected net: bcmgenet: correctly suspend and resume PHY device net: bcmgenet: request and enable main clock earlier net: ethernet: myricom: myri10ge: myri10ge.c: Cleaning up missing null-terminate after strncpy call xen-netfront: Fix handling packets on compound pages with skb_linearize net: fec: Support phys probed from devicetree and fixed-link smsc: replace WARN_ON() with WARN_ON_SMP() xen-netback: Don't deschedule NAPI when carrier off net: ethernet: qlogic: qlcnic: Remove duplicate object file from Makefile wan: wanxl: Remove typedefs from struct names m68k/atari: EtherNEC - ethernet support (ne) net: ethernet: ti: cpmac.c: Cleaning up missing null-terminate after strncpy call hdlc: Remove typedefs from struct names airo_cs: Remove typedef local_info_t atmel: Remove typedef atmel_priv_ioctl com20020_cs: Remove typedef com20020_dev_t ethernet: amd: Remove typedef local_info_t net: Always untag vlan-tagged traffic on input. drivers: net: Add APM X-Gene SoC ethernet driver support. ...
-rw-r--r--Documentation/devicetree/bindings/net/apm-xgene-enet.txt66
-rw-r--r--Documentation/devicetree/bindings/net/fsl-fec.txt29
-rw-r--r--MAINTAINERS8
-rw-r--r--arch/arm64/boot/dts/apm-mustang.dts4
-rw-r--r--arch/arm64/boot/dts/apm-storm.dtsi30
-rw-r--r--drivers/atm/atmtcp.c1
-rw-r--r--drivers/atm/solos-pci.c1
-rw-r--r--drivers/net/arcnet/com20020_cs.c16
-rw-r--r--drivers/net/ethernet/8390/Kconfig3
-rw-r--r--drivers/net/ethernet/8390/axnet_cs.c26
-rw-r--r--drivers/net/ethernet/8390/ne.c2
-rw-r--r--drivers/net/ethernet/8390/pcnet_cs.c68
-rw-r--r--drivers/net/ethernet/Kconfig1
-rw-r--r--drivers/net/ethernet/Makefile1
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-drv.c1
-rw-r--r--drivers/net/ethernet/apm/Kconfig1
-rw-r--r--drivers/net/ethernet/apm/Makefile5
-rw-r--r--drivers/net/ethernet/apm/xgene/Kconfig9
-rw-r--r--drivers/net/ethernet/apm/xgene/Makefile6
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c125
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.c728
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.h337
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.c951
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.h135
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c37
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c14
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4.h11
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c260
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.h10
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c2
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h12
-rw-r--r--drivers/net/ethernet/davicom/dm9000.c92
-rw-r--r--drivers/net/ethernet/freescale/fec.h1
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c76
-rw-r--r--drivers/net/ethernet/freescale/fec_mpc52xx.c3
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c2
-rw-r--r--drivers/net/ethernet/freescale/gianfar.c16
-rw-r--r--drivers/net/ethernet/freescale/ucc_geth.c24
-rw-r--r--drivers/net/ethernet/fujitsu/fmvj18x_cs.c34
-rw-r--r--drivers/net/ethernet/marvell/mvneta.c9
-rw-r--r--drivers/net/ethernet/myricom/myri10ge/myri10ge.c1
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/Makefile2
-rw-r--r--drivers/net/ethernet/smsc/smsc911x.h2
-rw-r--r--drivers/net/ethernet/ti/cpmac.c1
-rw-r--r--drivers/net/ethernet/xilinx/ll_temac_main.c3
-rw-r--r--drivers/net/ethernet/xilinx/xilinx_axienet_main.c3
-rw-r--r--drivers/net/ethernet/xircom/xirc2ps_cs.c40
-rw-r--r--drivers/net/wan/hdlc_fr.c63
-rw-r--r--drivers/net/wan/wanxl.c63
-rw-r--r--drivers/net/wireless/airo_cs.c25
-rw-r--r--drivers/net/wireless/atmel.c8
-rw-r--r--drivers/net/xen-netback/interface.c6
-rw-r--r--drivers/net/xen-netback/netback.c10
-rw-r--r--drivers/net/xen-netfront.c7
-rw-r--r--include/linux/if_vlan.h6
-rw-r--r--include/linux/skbuff.h1
-rw-r--r--net/6lowpan/Kconfig2
-rw-r--r--net/8021q/vlan_core.c53
-rw-r--r--net/batman-adv/multicast.c1
-rw-r--r--net/bridge/br_vlan.c2
-rw-r--r--net/bridge/netfilter/ebtables.c10
-rw-r--r--net/core/dev.c2
-rw-r--r--net/core/rtnetlink.c3
-rw-r--r--net/core/skbuff.c53
-rw-r--r--net/ipv4/route.c2
-rw-r--r--net/netfilter/core.c11
-rw-r--r--net/netfilter/ipvs/ip_vs_ctl.c19
-rw-r--r--net/netfilter/nf_sockopt.c8
-rw-r--r--net/netfilter/nf_tables_api.c30
-rw-r--r--net/netfilter/x_tables.c47
-rw-r--r--net/netlink/af_netlink.c2
-rw-r--r--net/openvswitch/datapath.c2
72 files changed, 3114 insertions, 531 deletions
diff --git a/Documentation/devicetree/bindings/net/apm-xgene-enet.txt b/Documentation/devicetree/bindings/net/apm-xgene-enet.txt
new file mode 100644
index 000000000000..ebcad25efd0a
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/apm-xgene-enet.txt
@@ -0,0 +1,66 @@
1APM X-Gene SoC Ethernet nodes
2
3Ethernet nodes are defined to describe on-chip ethernet interfaces in
4APM X-Gene SoC.
5
6Required properties:
7- compatible: Should be "apm,xgene-enet"
8- reg: Address and length of the register set for the device. It contains the
9 information of registers in the same order as described by reg-names
10- reg-names: Should contain the register set names
11 - "enet_csr": Ethernet control and status register address space
12 - "ring_csr": Descriptor ring control and status register address space
13 - "ring_cmd": Descriptor ring command register address space
14- interrupts: Ethernet main interrupt
15- clocks: Reference to the clock entry.
16- local-mac-address: MAC address assigned to this device
17- phy-connection-type: Interface type between ethernet device and PHY device
18- phy-handle: Reference to a PHY node connected to this device
19
20- mdio: Device tree subnode with the following required properties:
21 - compatible: Must be "apm,xgene-mdio".
22 - #address-cells: Must be <1>.
23 - #size-cells: Must be <0>.
24
25 For the phy on the mdio bus, there must be a node with the following fields:
26 - compatible: PHY identifier. Please refer ./phy.txt for the format.
27 - reg: The ID number for the phy.
28
29Optional properties:
30- status: Should be "ok" or "disabled" for enabled/disabled. Default is "ok".
31
32Example:
33 menetclk: menetclk {
34 compatible = "apm,xgene-device-clock";
35 clock-output-names = "menetclk";
36 status = "ok";
37 };
38
39 menet: ethernet@17020000 {
40 compatible = "apm,xgene-enet";
41 status = "disabled";
42 reg = <0x0 0x17020000 0x0 0xd100>,
43 <0x0 0X17030000 0x0 0X400>,
44 <0x0 0X10000000 0x0 0X200>;
45 reg-names = "enet_csr", "ring_csr", "ring_cmd";
46 interrupts = <0x0 0x3c 0x4>;
47 clocks = <&menetclk 0>;
48 local-mac-address = [00 01 73 00 00 01];
49 phy-connection-type = "rgmii";
50 phy-handle = <&menetphy>;
51 mdio {
52 compatible = "apm,xgene-mdio";
53 #address-cells = <1>;
54 #size-cells = <0>;
55 menetphy: menetphy@3 {
56 compatible = "ethernet-phy-id001c.c915";
57 reg = <0x3>;
58 };
59
60 };
61 };
62
63/* Board-specific peripheral configurations */
64&menet {
65 status = "ok";
66};
diff --git a/Documentation/devicetree/bindings/net/fsl-fec.txt b/Documentation/devicetree/bindings/net/fsl-fec.txt
index 6bc84adb10c0..8a2c7b55ec16 100644
--- a/Documentation/devicetree/bindings/net/fsl-fec.txt
+++ b/Documentation/devicetree/bindings/net/fsl-fec.txt
@@ -12,7 +12,14 @@ Optional properties:
12 only if property "phy-reset-gpios" is available. Missing the property 12 only if property "phy-reset-gpios" is available. Missing the property
13 will have the duration be 1 millisecond. Numbers greater than 1000 are 13 will have the duration be 1 millisecond. Numbers greater than 1000 are
14 invalid and 1 millisecond will be used instead. 14 invalid and 1 millisecond will be used instead.
15- phy-supply: regulator that powers the Ethernet PHY. 15- phy-supply : regulator that powers the Ethernet PHY.
16- phy-handle : phandle to the PHY device connected to this device.
17- fixed-link : Assume a fixed link. See fixed-link.txt in the same directory.
18 Use instead of phy-handle.
19
20Optional subnodes:
21- mdio : specifies the mdio bus in the FEC, used as a container for phy nodes
22 according to phy.txt in the same directory
16 23
17Example: 24Example:
18 25
@@ -25,3 +32,23 @@ ethernet@83fec000 {
25 local-mac-address = [00 04 9F 01 1B B9]; 32 local-mac-address = [00 04 9F 01 1B B9];
26 phy-supply = <&reg_fec_supply>; 33 phy-supply = <&reg_fec_supply>;
27}; 34};
35
36Example with phy specified:
37
38ethernet@83fec000 {
39 compatible = "fsl,imx51-fec", "fsl,imx27-fec";
40 reg = <0x83fec000 0x4000>;
41 interrupts = <87>;
42 phy-mode = "mii";
43 phy-reset-gpios = <&gpio2 14 0>; /* GPIO2_14 */
44 local-mac-address = [00 04 9F 01 1B B9];
45 phy-supply = <&reg_fec_supply>;
46 phy-handle = <&ethphy>;
47 mdio {
48 ethphy: ethernet-phy@6 {
49 compatible = "ethernet-phy-ieee802.3-c22";
50 reg = <6>;
51 max-speed = <100>;
52 };
53 };
54};
diff --git a/MAINTAINERS b/MAINTAINERS
index 7e2eb4c646e3..2f85f55c8fb8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -719,6 +719,14 @@ S: Maintained
719F: drivers/net/appletalk/ 719F: drivers/net/appletalk/
720F: net/appletalk/ 720F: net/appletalk/
721 721
722APPLIED MICRO (APM) X-GENE SOC ETHERNET DRIVER
723M: Iyappan Subramanian <isubramanian@apm.com>
724M: Keyur Chudgar <kchudgar@apm.com>
725M: Ravi Patel <rapatel@apm.com>
726S: Supported
727F: drivers/net/ethernet/apm/xgene/
728F: Documentation/devicetree/bindings/net/apm-xgene-enet.txt
729
722APTINA CAMERA SENSOR PLL 730APTINA CAMERA SENSOR PLL
723M: Laurent Pinchart <Laurent.pinchart@ideasonboard.com> 731M: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
724L: linux-media@vger.kernel.org 732L: linux-media@vger.kernel.org
diff --git a/arch/arm64/boot/dts/apm-mustang.dts b/arch/arm64/boot/dts/apm-mustang.dts
index 6541962f5d70..b2f56229aa5e 100644
--- a/arch/arm64/boot/dts/apm-mustang.dts
+++ b/arch/arm64/boot/dts/apm-mustang.dts
@@ -28,3 +28,7 @@
28&serial0 { 28&serial0 {
29 status = "ok"; 29 status = "ok";
30}; 30};
31
32&menet {
33 status = "ok";
34};
diff --git a/arch/arm64/boot/dts/apm-storm.dtsi b/arch/arm64/boot/dts/apm-storm.dtsi
index 40aa96ce13c4..c0aceef7f5b3 100644
--- a/arch/arm64/boot/dts/apm-storm.dtsi
+++ b/arch/arm64/boot/dts/apm-storm.dtsi
@@ -167,14 +167,13 @@
167 clock-output-names = "ethclk"; 167 clock-output-names = "ethclk";
168 }; 168 };
169 169
170 eth8clk: eth8clk { 170 menetclk: menetclk {
171 compatible = "apm,xgene-device-clock"; 171 compatible = "apm,xgene-device-clock";
172 #clock-cells = <1>; 172 #clock-cells = <1>;
173 clocks = <&ethclk 0>; 173 clocks = <&ethclk 0>;
174 clock-names = "eth8clk";
175 reg = <0x0 0x1702C000 0x0 0x1000>; 174 reg = <0x0 0x1702C000 0x0 0x1000>;
176 reg-names = "csr-reg"; 175 reg-names = "csr-reg";
177 clock-output-names = "eth8clk"; 176 clock-output-names = "menetclk";
178 }; 177 };
179 178
180 sataphy1clk: sataphy1clk@1f21c000 { 179 sataphy1clk: sataphy1clk@1f21c000 {
@@ -397,5 +396,30 @@
397 #clock-cells = <1>; 396 #clock-cells = <1>;
398 clocks = <&rtcclk 0>; 397 clocks = <&rtcclk 0>;
399 }; 398 };
399
400 menet: ethernet@17020000 {
401 compatible = "apm,xgene-enet";
402 status = "disabled";
403 reg = <0x0 0x17020000 0x0 0xd100>,
404 <0x0 0X17030000 0x0 0X400>,
405 <0x0 0X10000000 0x0 0X200>;
406 reg-names = "enet_csr", "ring_csr", "ring_cmd";
407 interrupts = <0x0 0x3c 0x4>;
408 dma-coherent;
409 clocks = <&menetclk 0>;
410 local-mac-address = [00 01 73 00 00 01];
411 phy-connection-type = "rgmii";
412 phy-handle = <&menetphy>;
413 mdio {
414 compatible = "apm,xgene-mdio";
415 #address-cells = <1>;
416 #size-cells = <0>;
417 menetphy: menetphy@3 {
418 compatible = "ethernet-phy-id001c.c915";
419 reg = <0x3>;
420 };
421
422 };
423 };
400 }; 424 };
401}; 425};
diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c
index 0e3f8f9dcd29..480fa6ffbc09 100644
--- a/drivers/atm/atmtcp.c
+++ b/drivers/atm/atmtcp.c
@@ -299,6 +299,7 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
299 out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci)); 299 out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci));
300 read_unlock(&vcc_sklist_lock); 300 read_unlock(&vcc_sklist_lock);
301 if (!out_vcc) { 301 if (!out_vcc) {
302 result = -EUNATCH;
302 atomic_inc(&vcc->stats->tx_err); 303 atomic_inc(&vcc->stats->tx_err);
303 goto done; 304 goto done;
304 } 305 }
diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c
index 943cf0d6abaf..7652e8dc188f 100644
--- a/drivers/atm/solos-pci.c
+++ b/drivers/atm/solos-pci.c
@@ -1278,6 +1278,7 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
1278 card->dma_bounce = kmalloc(card->nr_ports * BUF_SIZE, GFP_KERNEL); 1278 card->dma_bounce = kmalloc(card->nr_ports * BUF_SIZE, GFP_KERNEL);
1279 if (!card->dma_bounce) { 1279 if (!card->dma_bounce) {
1280 dev_warn(&card->dev->dev, "Failed to allocate DMA bounce buffers\n"); 1280 dev_warn(&card->dev->dev, "Failed to allocate DMA bounce buffers\n");
1281 err = -ENOMEM;
1281 /* Fallback to MMIO doesn't work */ 1282 /* Fallback to MMIO doesn't work */
1282 goto out_unmap_both; 1283 goto out_unmap_both;
1283 } 1284 }
diff --git a/drivers/net/arcnet/com20020_cs.c b/drivers/net/arcnet/com20020_cs.c
index 326a612a2730..1a790a20210d 100644
--- a/drivers/net/arcnet/com20020_cs.c
+++ b/drivers/net/arcnet/com20020_cs.c
@@ -112,20 +112,20 @@ static void com20020_detach(struct pcmcia_device *p_dev);
112 112
113/*====================================================================*/ 113/*====================================================================*/
114 114
115typedef struct com20020_dev_t { 115struct com20020_dev {
116 struct net_device *dev; 116 struct net_device *dev;
117} com20020_dev_t; 117};
118 118
119static int com20020_probe(struct pcmcia_device *p_dev) 119static int com20020_probe(struct pcmcia_device *p_dev)
120{ 120{
121 com20020_dev_t *info; 121 struct com20020_dev *info;
122 struct net_device *dev; 122 struct net_device *dev;
123 struct arcnet_local *lp; 123 struct arcnet_local *lp;
124 124
125 dev_dbg(&p_dev->dev, "com20020_attach()\n"); 125 dev_dbg(&p_dev->dev, "com20020_attach()\n");
126 126
127 /* Create new network device */ 127 /* Create new network device */
128 info = kzalloc(sizeof(struct com20020_dev_t), GFP_KERNEL); 128 info = kzalloc(sizeof(*info), GFP_KERNEL);
129 if (!info) 129 if (!info)
130 goto fail_alloc_info; 130 goto fail_alloc_info;
131 131
@@ -160,7 +160,7 @@ fail_alloc_info:
160 160
161static void com20020_detach(struct pcmcia_device *link) 161static void com20020_detach(struct pcmcia_device *link)
162{ 162{
163 struct com20020_dev_t *info = link->priv; 163 struct com20020_dev *info = link->priv;
164 struct net_device *dev = info->dev; 164 struct net_device *dev = info->dev;
165 165
166 dev_dbg(&link->dev, "detach...\n"); 166 dev_dbg(&link->dev, "detach...\n");
@@ -199,7 +199,7 @@ static void com20020_detach(struct pcmcia_device *link)
199static int com20020_config(struct pcmcia_device *link) 199static int com20020_config(struct pcmcia_device *link)
200{ 200{
201 struct arcnet_local *lp; 201 struct arcnet_local *lp;
202 com20020_dev_t *info; 202 struct com20020_dev *info;
203 struct net_device *dev; 203 struct net_device *dev;
204 int i, ret; 204 int i, ret;
205 int ioaddr; 205 int ioaddr;
@@ -291,7 +291,7 @@ static void com20020_release(struct pcmcia_device *link)
291 291
292static int com20020_suspend(struct pcmcia_device *link) 292static int com20020_suspend(struct pcmcia_device *link)
293{ 293{
294 com20020_dev_t *info = link->priv; 294 struct com20020_dev *info = link->priv;
295 struct net_device *dev = info->dev; 295 struct net_device *dev = info->dev;
296 296
297 if (link->open) 297 if (link->open)
@@ -302,7 +302,7 @@ static int com20020_suspend(struct pcmcia_device *link)
302 302
303static int com20020_resume(struct pcmcia_device *link) 303static int com20020_resume(struct pcmcia_device *link)
304{ 304{
305 com20020_dev_t *info = link->priv; 305 struct com20020_dev *info = link->priv;
306 struct net_device *dev = info->dev; 306 struct net_device *dev = info->dev;
307 307
308 if (link->open) { 308 if (link->open) {
diff --git a/drivers/net/ethernet/8390/Kconfig b/drivers/net/ethernet/8390/Kconfig
index 0988811f4e40..2d89bd00de61 100644
--- a/drivers/net/ethernet/8390/Kconfig
+++ b/drivers/net/ethernet/8390/Kconfig
@@ -91,7 +91,8 @@ config MCF8390
91 91
92config NE2000 92config NE2000
93 tristate "NE2000/NE1000 support" 93 tristate "NE2000/NE1000 support"
94 depends on (ISA || (Q40 && m) || M32R || MACH_TX49XX) 94 depends on (ISA || (Q40 && m) || M32R || MACH_TX49XX || \
95 ATARI_ETHERNEC)
95 select CRC32 96 select CRC32
96 ---help--- 97 ---help---
97 If you have a network (Ethernet) card of this type, say Y and read 98 If you have a network (Ethernet) card of this type, say Y and read
diff --git a/drivers/net/ethernet/8390/axnet_cs.c b/drivers/net/ethernet/8390/axnet_cs.c
index 73c57a4a7b9e..7769c05543f1 100644
--- a/drivers/net/ethernet/8390/axnet_cs.c
+++ b/drivers/net/ethernet/8390/axnet_cs.c
@@ -108,7 +108,7 @@ static u32 axnet_msg_enable;
108 108
109/*====================================================================*/ 109/*====================================================================*/
110 110
111typedef struct axnet_dev_t { 111struct axnet_dev {
112 struct pcmcia_device *p_dev; 112 struct pcmcia_device *p_dev;
113 caddr_t base; 113 caddr_t base;
114 struct timer_list watchdog; 114 struct timer_list watchdog;
@@ -118,9 +118,9 @@ typedef struct axnet_dev_t {
118 int phy_id; 118 int phy_id;
119 int flags; 119 int flags;
120 int active_low; 120 int active_low;
121} axnet_dev_t; 121};
122 122
123static inline axnet_dev_t *PRIV(struct net_device *dev) 123static inline struct axnet_dev *PRIV(struct net_device *dev)
124{ 124{
125 void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device); 125 void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device);
126 return p; 126 return p;
@@ -141,13 +141,13 @@ static const struct net_device_ops axnet_netdev_ops = {
141 141
142static int axnet_probe(struct pcmcia_device *link) 142static int axnet_probe(struct pcmcia_device *link)
143{ 143{
144 axnet_dev_t *info; 144 struct axnet_dev *info;
145 struct net_device *dev; 145 struct net_device *dev;
146 struct ei_device *ei_local; 146 struct ei_device *ei_local;
147 147
148 dev_dbg(&link->dev, "axnet_attach()\n"); 148 dev_dbg(&link->dev, "axnet_attach()\n");
149 149
150 dev = alloc_etherdev(sizeof(struct ei_device) + sizeof(axnet_dev_t)); 150 dev = alloc_etherdev(sizeof(struct ei_device) + sizeof(struct axnet_dev));
151 if (!dev) 151 if (!dev)
152 return -ENOMEM; 152 return -ENOMEM;
153 153
@@ -274,7 +274,7 @@ static int axnet_configcheck(struct pcmcia_device *p_dev, void *priv_data)
274static int axnet_config(struct pcmcia_device *link) 274static int axnet_config(struct pcmcia_device *link)
275{ 275{
276 struct net_device *dev = link->priv; 276 struct net_device *dev = link->priv;
277 axnet_dev_t *info = PRIV(dev); 277 struct axnet_dev *info = PRIV(dev);
278 int i, j, j2, ret; 278 int i, j, j2, ret;
279 279
280 dev_dbg(&link->dev, "axnet_config(0x%p)\n", link); 280 dev_dbg(&link->dev, "axnet_config(0x%p)\n", link);
@@ -389,7 +389,7 @@ static int axnet_suspend(struct pcmcia_device *link)
389static int axnet_resume(struct pcmcia_device *link) 389static int axnet_resume(struct pcmcia_device *link)
390{ 390{
391 struct net_device *dev = link->priv; 391 struct net_device *dev = link->priv;
392 axnet_dev_t *info = PRIV(dev); 392 struct axnet_dev *info = PRIV(dev);
393 393
394 if (link->open) { 394 if (link->open) {
395 if (info->active_low == 1) 395 if (info->active_low == 1)
@@ -467,7 +467,7 @@ static void mdio_write(unsigned int addr, int phy_id, int loc, int value)
467static int axnet_open(struct net_device *dev) 467static int axnet_open(struct net_device *dev)
468{ 468{
469 int ret; 469 int ret;
470 axnet_dev_t *info = PRIV(dev); 470 struct axnet_dev *info = PRIV(dev);
471 struct pcmcia_device *link = info->p_dev; 471 struct pcmcia_device *link = info->p_dev;
472 unsigned int nic_base = dev->base_addr; 472 unsigned int nic_base = dev->base_addr;
473 473
@@ -497,7 +497,7 @@ static int axnet_open(struct net_device *dev)
497 497
498static int axnet_close(struct net_device *dev) 498static int axnet_close(struct net_device *dev)
499{ 499{
500 axnet_dev_t *info = PRIV(dev); 500 struct axnet_dev *info = PRIV(dev);
501 struct pcmcia_device *link = info->p_dev; 501 struct pcmcia_device *link = info->p_dev;
502 502
503 dev_dbg(&link->dev, "axnet_close('%s')\n", dev->name); 503 dev_dbg(&link->dev, "axnet_close('%s')\n", dev->name);
@@ -554,7 +554,7 @@ static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
554static void ei_watchdog(u_long arg) 554static void ei_watchdog(u_long arg)
555{ 555{
556 struct net_device *dev = (struct net_device *)(arg); 556 struct net_device *dev = (struct net_device *)(arg);
557 axnet_dev_t *info = PRIV(dev); 557 struct axnet_dev *info = PRIV(dev);
558 unsigned int nic_base = dev->base_addr; 558 unsigned int nic_base = dev->base_addr;
559 unsigned int mii_addr = nic_base + AXNET_MII_EEP; 559 unsigned int mii_addr = nic_base + AXNET_MII_EEP;
560 u_short link; 560 u_short link;
@@ -610,7 +610,7 @@ reschedule:
610 610
611static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 611static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
612{ 612{
613 axnet_dev_t *info = PRIV(dev); 613 struct axnet_dev *info = PRIV(dev);
614 struct mii_ioctl_data *data = if_mii(rq); 614 struct mii_ioctl_data *data = if_mii(rq);
615 unsigned int mii_addr = dev->base_addr + AXNET_MII_EEP; 615 unsigned int mii_addr = dev->base_addr + AXNET_MII_EEP;
616 switch (cmd) { 616 switch (cmd) {
@@ -1452,7 +1452,7 @@ static void ei_receive(struct net_device *dev)
1452 1452
1453static void ei_rx_overrun(struct net_device *dev) 1453static void ei_rx_overrun(struct net_device *dev)
1454{ 1454{
1455 axnet_dev_t *info = PRIV(dev); 1455 struct axnet_dev *info = PRIV(dev);
1456 long e8390_base = dev->base_addr; 1456 long e8390_base = dev->base_addr;
1457 unsigned char was_txing, must_resend = 0; 1457 unsigned char was_txing, must_resend = 0;
1458 struct ei_device *ei_local = netdev_priv(dev); 1458 struct ei_device *ei_local = netdev_priv(dev);
@@ -1624,7 +1624,7 @@ static void set_multicast_list(struct net_device *dev)
1624 1624
1625static void AX88190_init(struct net_device *dev, int startp) 1625static void AX88190_init(struct net_device *dev, int startp)
1626{ 1626{
1627 axnet_dev_t *info = PRIV(dev); 1627 struct axnet_dev *info = PRIV(dev);
1628 long e8390_base = dev->base_addr; 1628 long e8390_base = dev->base_addr;
1629 struct ei_device *ei_local = netdev_priv(dev); 1629 struct ei_device *ei_local = netdev_priv(dev);
1630 int i; 1630 int i;
diff --git a/drivers/net/ethernet/8390/ne.c b/drivers/net/ethernet/8390/ne.c
index 58eaa8f34942..de566fb6e0f7 100644
--- a/drivers/net/ethernet/8390/ne.c
+++ b/drivers/net/ethernet/8390/ne.c
@@ -169,6 +169,8 @@ bad_clone_list[] __initdata = {
169#elif defined(CONFIG_PLAT_OAKS32R) || \ 169#elif defined(CONFIG_PLAT_OAKS32R) || \
170 defined(CONFIG_MACH_TX49XX) 170 defined(CONFIG_MACH_TX49XX)
171# define DCR_VAL 0x48 /* 8-bit mode */ 171# define DCR_VAL 0x48 /* 8-bit mode */
172#elif defined(CONFIG_ATARI) /* 8-bit mode on Atari, normal on Q40 */
173# define DCR_VAL (MACH_IS_ATARI ? 0x48 : 0x49)
172#else 174#else
173# define DCR_VAL 0x49 175# define DCR_VAL 0x49
174#endif 176#endif
diff --git a/drivers/net/ethernet/8390/pcnet_cs.c b/drivers/net/ethernet/8390/pcnet_cs.c
index ca3c2b921cf6..9fb7b9d4fd6c 100644
--- a/drivers/net/ethernet/8390/pcnet_cs.c
+++ b/drivers/net/ethernet/8390/pcnet_cs.c
@@ -111,11 +111,11 @@ static void pcnet_detach(struct pcmcia_device *p_dev);
111 111
112/*====================================================================*/ 112/*====================================================================*/
113 113
114typedef struct hw_info_t { 114struct hw_info {
115 u_int offset; 115 u_int offset;
116 u_char a0, a1, a2; 116 u_char a0, a1, a2;
117 u_int flags; 117 u_int flags;
118} hw_info_t; 118};
119 119
120#define DELAY_OUTPUT 0x01 120#define DELAY_OUTPUT 0x01
121#define HAS_MISC_REG 0x02 121#define HAS_MISC_REG 0x02
@@ -132,7 +132,7 @@ typedef struct hw_info_t {
132#define MII_PHYID_REG1 0x02 132#define MII_PHYID_REG1 0x02
133#define MII_PHYID_REG2 0x03 133#define MII_PHYID_REG2 0x03
134 134
135static hw_info_t hw_info[] = { 135static struct hw_info hw_info[] = {
136 { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT }, 136 { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT },
137 { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 }, 137 { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 },
138 { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 }, 138 { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 },
@@ -196,11 +196,11 @@ static hw_info_t hw_info[] = {
196 196
197#define NR_INFO ARRAY_SIZE(hw_info) 197#define NR_INFO ARRAY_SIZE(hw_info)
198 198
199static hw_info_t default_info = { 0, 0, 0, 0, 0 }; 199static struct hw_info default_info = { 0, 0, 0, 0, 0 };
200static hw_info_t dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII }; 200static struct hw_info dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII };
201static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII }; 201static struct hw_info dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII };
202 202
203typedef struct pcnet_dev_t { 203struct pcnet_dev {
204 struct pcmcia_device *p_dev; 204 struct pcmcia_device *p_dev;
205 u_int flags; 205 u_int flags;
206 void __iomem *base; 206 void __iomem *base;
@@ -210,12 +210,12 @@ typedef struct pcnet_dev_t {
210 u_char eth_phy, pna_phy; 210 u_char eth_phy, pna_phy;
211 u_short link_status; 211 u_short link_status;
212 u_long mii_reset; 212 u_long mii_reset;
213} pcnet_dev_t; 213};
214 214
215static inline pcnet_dev_t *PRIV(struct net_device *dev) 215static inline struct pcnet_dev *PRIV(struct net_device *dev)
216{ 216{
217 char *p = netdev_priv(dev); 217 char *p = netdev_priv(dev);
218 return (pcnet_dev_t *)(p + sizeof(struct ei_device)); 218 return (struct pcnet_dev *)(p + sizeof(struct ei_device));
219} 219}
220 220
221static const struct net_device_ops pcnet_netdev_ops = { 221static const struct net_device_ops pcnet_netdev_ops = {
@@ -237,13 +237,13 @@ static const struct net_device_ops pcnet_netdev_ops = {
237 237
238static int pcnet_probe(struct pcmcia_device *link) 238static int pcnet_probe(struct pcmcia_device *link)
239{ 239{
240 pcnet_dev_t *info; 240 struct pcnet_dev *info;
241 struct net_device *dev; 241 struct net_device *dev;
242 242
243 dev_dbg(&link->dev, "pcnet_attach()\n"); 243 dev_dbg(&link->dev, "pcnet_attach()\n");
244 244
245 /* Create new ethernet device */ 245 /* Create new ethernet device */
246 dev = __alloc_ei_netdev(sizeof(pcnet_dev_t)); 246 dev = __alloc_ei_netdev(sizeof(struct pcnet_dev));
247 if (!dev) return -ENOMEM; 247 if (!dev) return -ENOMEM;
248 info = PRIV(dev); 248 info = PRIV(dev);
249 info->p_dev = link; 249 info->p_dev = link;
@@ -276,7 +276,7 @@ static void pcnet_detach(struct pcmcia_device *link)
276 276
277======================================================================*/ 277======================================================================*/
278 278
279static hw_info_t *get_hwinfo(struct pcmcia_device *link) 279static struct hw_info *get_hwinfo(struct pcmcia_device *link)
280{ 280{
281 struct net_device *dev = link->priv; 281 struct net_device *dev = link->priv;
282 u_char __iomem *base, *virt; 282 u_char __iomem *base, *virt;
@@ -317,7 +317,7 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link)
317 317
318======================================================================*/ 318======================================================================*/
319 319
320static hw_info_t *get_prom(struct pcmcia_device *link) 320static struct hw_info *get_prom(struct pcmcia_device *link)
321{ 321{
322 struct net_device *dev = link->priv; 322 struct net_device *dev = link->priv;
323 unsigned int ioaddr = dev->base_addr; 323 unsigned int ioaddr = dev->base_addr;
@@ -371,7 +371,7 @@ static hw_info_t *get_prom(struct pcmcia_device *link)
371 371
372======================================================================*/ 372======================================================================*/
373 373
374static hw_info_t *get_dl10019(struct pcmcia_device *link) 374static struct hw_info *get_dl10019(struct pcmcia_device *link)
375{ 375{
376 struct net_device *dev = link->priv; 376 struct net_device *dev = link->priv;
377 int i; 377 int i;
@@ -393,7 +393,7 @@ static hw_info_t *get_dl10019(struct pcmcia_device *link)
393 393
394======================================================================*/ 394======================================================================*/
395 395
396static hw_info_t *get_ax88190(struct pcmcia_device *link) 396static struct hw_info *get_ax88190(struct pcmcia_device *link)
397{ 397{
398 struct net_device *dev = link->priv; 398 struct net_device *dev = link->priv;
399 unsigned int ioaddr = dev->base_addr; 399 unsigned int ioaddr = dev->base_addr;
@@ -424,7 +424,7 @@ static hw_info_t *get_ax88190(struct pcmcia_device *link)
424 424
425======================================================================*/ 425======================================================================*/
426 426
427static hw_info_t *get_hwired(struct pcmcia_device *link) 427static struct hw_info *get_hwired(struct pcmcia_device *link)
428{ 428{
429 struct net_device *dev = link->priv; 429 struct net_device *dev = link->priv;
430 int i; 430 int i;
@@ -489,12 +489,12 @@ static int pcnet_confcheck(struct pcmcia_device *p_dev, void *priv_data)
489 return try_io_port(p_dev); 489 return try_io_port(p_dev);
490} 490}
491 491
492static hw_info_t *pcnet_try_config(struct pcmcia_device *link, 492static struct hw_info *pcnet_try_config(struct pcmcia_device *link,
493 int *has_shmem, int try) 493 int *has_shmem, int try)
494{ 494{
495 struct net_device *dev = link->priv; 495 struct net_device *dev = link->priv;
496 hw_info_t *local_hw_info; 496 struct hw_info *local_hw_info;
497 pcnet_dev_t *info = PRIV(dev); 497 struct pcnet_dev *info = PRIV(dev);
498 int priv = try; 498 int priv = try;
499 int ret; 499 int ret;
500 500
@@ -553,10 +553,10 @@ static hw_info_t *pcnet_try_config(struct pcmcia_device *link,
553static int pcnet_config(struct pcmcia_device *link) 553static int pcnet_config(struct pcmcia_device *link)
554{ 554{
555 struct net_device *dev = link->priv; 555 struct net_device *dev = link->priv;
556 pcnet_dev_t *info = PRIV(dev); 556 struct pcnet_dev *info = PRIV(dev);
557 int start_pg, stop_pg, cm_offset; 557 int start_pg, stop_pg, cm_offset;
558 int has_shmem = 0; 558 int has_shmem = 0;
559 hw_info_t *local_hw_info; 559 struct hw_info *local_hw_info;
560 struct ei_device *ei_local; 560 struct ei_device *ei_local;
561 561
562 dev_dbg(&link->dev, "pcnet_config\n"); 562 dev_dbg(&link->dev, "pcnet_config\n");
@@ -639,7 +639,7 @@ failed:
639 639
640static void pcnet_release(struct pcmcia_device *link) 640static void pcnet_release(struct pcmcia_device *link)
641{ 641{
642 pcnet_dev_t *info = PRIV(link->priv); 642 struct pcnet_dev *info = PRIV(link->priv);
643 643
644 dev_dbg(&link->dev, "pcnet_release\n"); 644 dev_dbg(&link->dev, "pcnet_release\n");
645 645
@@ -836,7 +836,7 @@ static void write_asic(unsigned int ioaddr, int location, short asic_data)
836static void set_misc_reg(struct net_device *dev) 836static void set_misc_reg(struct net_device *dev)
837{ 837{
838 unsigned int nic_base = dev->base_addr; 838 unsigned int nic_base = dev->base_addr;
839 pcnet_dev_t *info = PRIV(dev); 839 struct pcnet_dev *info = PRIV(dev);
840 u_char tmp; 840 u_char tmp;
841 841
842 if (info->flags & HAS_MISC_REG) { 842 if (info->flags & HAS_MISC_REG) {
@@ -873,7 +873,7 @@ static void set_misc_reg(struct net_device *dev)
873 873
874static void mii_phy_probe(struct net_device *dev) 874static void mii_phy_probe(struct net_device *dev)
875{ 875{
876 pcnet_dev_t *info = PRIV(dev); 876 struct pcnet_dev *info = PRIV(dev);
877 unsigned int mii_addr = dev->base_addr + DLINK_GPIO; 877 unsigned int mii_addr = dev->base_addr + DLINK_GPIO;
878 int i; 878 int i;
879 u_int tmp, phyid; 879 u_int tmp, phyid;
@@ -898,7 +898,7 @@ static void mii_phy_probe(struct net_device *dev)
898static int pcnet_open(struct net_device *dev) 898static int pcnet_open(struct net_device *dev)
899{ 899{
900 int ret; 900 int ret;
901 pcnet_dev_t *info = PRIV(dev); 901 struct pcnet_dev *info = PRIV(dev);
902 struct pcmcia_device *link = info->p_dev; 902 struct pcmcia_device *link = info->p_dev;
903 unsigned int nic_base = dev->base_addr; 903 unsigned int nic_base = dev->base_addr;
904 904
@@ -931,7 +931,7 @@ static int pcnet_open(struct net_device *dev)
931 931
932static int pcnet_close(struct net_device *dev) 932static int pcnet_close(struct net_device *dev)
933{ 933{
934 pcnet_dev_t *info = PRIV(dev); 934 struct pcnet_dev *info = PRIV(dev);
935 struct pcmcia_device *link = info->p_dev; 935 struct pcmcia_device *link = info->p_dev;
936 936
937 dev_dbg(&link->dev, "pcnet_close('%s')\n", dev->name); 937 dev_dbg(&link->dev, "pcnet_close('%s')\n", dev->name);
@@ -982,7 +982,7 @@ static void pcnet_reset_8390(struct net_device *dev)
982 982
983static int set_config(struct net_device *dev, struct ifmap *map) 983static int set_config(struct net_device *dev, struct ifmap *map)
984{ 984{
985 pcnet_dev_t *info = PRIV(dev); 985 struct pcnet_dev *info = PRIV(dev);
986 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { 986 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
987 if (!(info->flags & HAS_MISC_REG)) 987 if (!(info->flags & HAS_MISC_REG))
988 return -EOPNOTSUPP; 988 return -EOPNOTSUPP;
@@ -1000,7 +1000,7 @@ static int set_config(struct net_device *dev, struct ifmap *map)
1000static irqreturn_t ei_irq_wrapper(int irq, void *dev_id) 1000static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
1001{ 1001{
1002 struct net_device *dev = dev_id; 1002 struct net_device *dev = dev_id;
1003 pcnet_dev_t *info; 1003 struct pcnet_dev *info;
1004 irqreturn_t ret = ei_interrupt(irq, dev_id); 1004 irqreturn_t ret = ei_interrupt(irq, dev_id);
1005 1005
1006 if (ret == IRQ_HANDLED) { 1006 if (ret == IRQ_HANDLED) {
@@ -1013,7 +1013,7 @@ static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
1013static void ei_watchdog(u_long arg) 1013static void ei_watchdog(u_long arg)
1014{ 1014{
1015 struct net_device *dev = (struct net_device *)arg; 1015 struct net_device *dev = (struct net_device *)arg;
1016 pcnet_dev_t *info = PRIV(dev); 1016 struct pcnet_dev *info = PRIV(dev);
1017 unsigned int nic_base = dev->base_addr; 1017 unsigned int nic_base = dev->base_addr;
1018 unsigned int mii_addr = nic_base + DLINK_GPIO; 1018 unsigned int mii_addr = nic_base + DLINK_GPIO;
1019 u_short link; 1019 u_short link;
@@ -1101,7 +1101,7 @@ reschedule:
1101 1101
1102static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 1102static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1103{ 1103{
1104 pcnet_dev_t *info = PRIV(dev); 1104 struct pcnet_dev *info = PRIV(dev);
1105 struct mii_ioctl_data *data = if_mii(rq); 1105 struct mii_ioctl_data *data = if_mii(rq);
1106 unsigned int mii_addr = dev->base_addr + DLINK_GPIO; 1106 unsigned int mii_addr = dev->base_addr + DLINK_GPIO;
1107 1107
@@ -1214,7 +1214,7 @@ static void dma_block_output(struct net_device *dev, int count,
1214 const u_char *buf, const int start_page) 1214 const u_char *buf, const int start_page)
1215{ 1215{
1216 unsigned int nic_base = dev->base_addr; 1216 unsigned int nic_base = dev->base_addr;
1217 pcnet_dev_t *info = PRIV(dev); 1217 struct pcnet_dev *info = PRIV(dev);
1218#ifdef PCMCIA_DEBUG 1218#ifdef PCMCIA_DEBUG
1219 int retries = 0; 1219 int retries = 0;
1220 struct ei_device *ei_local = netdev_priv(dev); 1220 struct ei_device *ei_local = netdev_priv(dev);
@@ -1403,7 +1403,7 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
1403 int stop_pg, int cm_offset) 1403 int stop_pg, int cm_offset)
1404{ 1404{
1405 struct net_device *dev = link->priv; 1405 struct net_device *dev = link->priv;
1406 pcnet_dev_t *info = PRIV(dev); 1406 struct pcnet_dev *info = PRIV(dev);
1407 int i, window_size, offset, ret; 1407 int i, window_size, offset, ret;
1408 1408
1409 window_size = (stop_pg - start_pg) << 8; 1409 window_size = (stop_pg - start_pg) << 8;
diff --git a/drivers/net/ethernet/Kconfig b/drivers/net/ethernet/Kconfig
index edb718661850..dc7406c81c45 100644
--- a/drivers/net/ethernet/Kconfig
+++ b/drivers/net/ethernet/Kconfig
@@ -24,6 +24,7 @@ source "drivers/net/ethernet/allwinner/Kconfig"
24source "drivers/net/ethernet/alteon/Kconfig" 24source "drivers/net/ethernet/alteon/Kconfig"
25source "drivers/net/ethernet/altera/Kconfig" 25source "drivers/net/ethernet/altera/Kconfig"
26source "drivers/net/ethernet/amd/Kconfig" 26source "drivers/net/ethernet/amd/Kconfig"
27source "drivers/net/ethernet/apm/Kconfig"
27source "drivers/net/ethernet/apple/Kconfig" 28source "drivers/net/ethernet/apple/Kconfig"
28source "drivers/net/ethernet/arc/Kconfig" 29source "drivers/net/ethernet/arc/Kconfig"
29source "drivers/net/ethernet/atheros/Kconfig" 30source "drivers/net/ethernet/atheros/Kconfig"
diff --git a/drivers/net/ethernet/Makefile b/drivers/net/ethernet/Makefile
index 58de3339ab3c..224a01877149 100644
--- a/drivers/net/ethernet/Makefile
+++ b/drivers/net/ethernet/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_NET_VENDOR_ALLWINNER) += allwinner/
10obj-$(CONFIG_NET_VENDOR_ALTEON) += alteon/ 10obj-$(CONFIG_NET_VENDOR_ALTEON) += alteon/
11obj-$(CONFIG_ALTERA_TSE) += altera/ 11obj-$(CONFIG_ALTERA_TSE) += altera/
12obj-$(CONFIG_NET_VENDOR_AMD) += amd/ 12obj-$(CONFIG_NET_VENDOR_AMD) += amd/
13obj-$(CONFIG_NET_XGENE) += apm/
13obj-$(CONFIG_NET_VENDOR_APPLE) += apple/ 14obj-$(CONFIG_NET_VENDOR_APPLE) += apple/
14obj-$(CONFIG_NET_VENDOR_ARC) += arc/ 15obj-$(CONFIG_NET_VENDOR_ARC) += arc/
15obj-$(CONFIG_NET_VENDOR_ATHEROS) += atheros/ 16obj-$(CONFIG_NET_VENDOR_ATHEROS) += atheros/
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
index 1f5487f4888c..dc84f7193c2d 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
@@ -117,7 +117,6 @@
117#include <linux/spinlock.h> 117#include <linux/spinlock.h>
118#include <linux/tcp.h> 118#include <linux/tcp.h>
119#include <linux/if_vlan.h> 119#include <linux/if_vlan.h>
120#include <linux/phy.h>
121#include <net/busy_poll.h> 120#include <net/busy_poll.h>
122#include <linux/clk.h> 121#include <linux/clk.h>
123#include <linux/if_ether.h> 122#include <linux/if_ether.h>
diff --git a/drivers/net/ethernet/apm/Kconfig b/drivers/net/ethernet/apm/Kconfig
new file mode 100644
index 000000000000..ec63d706d464
--- /dev/null
+++ b/drivers/net/ethernet/apm/Kconfig
@@ -0,0 +1 @@
source "drivers/net/ethernet/apm/xgene/Kconfig"
diff --git a/drivers/net/ethernet/apm/Makefile b/drivers/net/ethernet/apm/Makefile
new file mode 100644
index 000000000000..65ce32ad1b2c
--- /dev/null
+++ b/drivers/net/ethernet/apm/Makefile
@@ -0,0 +1,5 @@
1#
2# Makefile for APM X-GENE Ethernet driver.
3#
4
5obj-$(CONFIG_NET_XGENE) += xgene/
diff --git a/drivers/net/ethernet/apm/xgene/Kconfig b/drivers/net/ethernet/apm/xgene/Kconfig
new file mode 100644
index 000000000000..616dff6d3f5f
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/Kconfig
@@ -0,0 +1,9 @@
1config NET_XGENE
2 tristate "APM X-Gene SoC Ethernet Driver"
3 select PHYLIB
4 help
5 This is the Ethernet driver for the on-chip ethernet interface on the
6 APM X-Gene SoC.
7
8 To compile this driver as a module, choose M here. This module will
9 be called xgene_enet.
diff --git a/drivers/net/ethernet/apm/xgene/Makefile b/drivers/net/ethernet/apm/xgene/Makefile
new file mode 100644
index 000000000000..c643e8a0a0dc
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/Makefile
@@ -0,0 +1,6 @@
1#
2# Makefile for APM X-Gene Ethernet Driver.
3#
4
5xgene-enet-objs := xgene_enet_hw.o xgene_enet_main.o xgene_enet_ethtool.o
6obj-$(CONFIG_NET_XGENE) += xgene-enet.o
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c b/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c
new file mode 100644
index 000000000000..63f2aa54a594
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_ethtool.c
@@ -0,0 +1,125 @@
1/* Applied Micro X-Gene SoC Ethernet Driver
2 *
3 * Copyright (c) 2014, Applied Micro Circuits Corporation
4 * Authors: Iyappan Subramanian <isubramanian@apm.com>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * 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, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <linux/ethtool.h>
21#include "xgene_enet_main.h"
22
23struct xgene_gstrings_stats {
24 char name[ETH_GSTRING_LEN];
25 int offset;
26};
27
28#define XGENE_STAT(m) { #m, offsetof(struct xgene_enet_pdata, stats.m) }
29
30static const struct xgene_gstrings_stats gstrings_stats[] = {
31 XGENE_STAT(rx_packets),
32 XGENE_STAT(tx_packets),
33 XGENE_STAT(rx_bytes),
34 XGENE_STAT(tx_bytes),
35 XGENE_STAT(rx_errors),
36 XGENE_STAT(tx_errors),
37 XGENE_STAT(rx_length_errors),
38 XGENE_STAT(rx_crc_errors),
39 XGENE_STAT(rx_frame_errors),
40 XGENE_STAT(rx_fifo_errors)
41};
42
43#define XGENE_STATS_LEN ARRAY_SIZE(gstrings_stats)
44
45static void xgene_get_drvinfo(struct net_device *ndev,
46 struct ethtool_drvinfo *info)
47{
48 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
49 struct platform_device *pdev = pdata->pdev;
50
51 strcpy(info->driver, "xgene_enet");
52 strcpy(info->version, XGENE_DRV_VERSION);
53 snprintf(info->fw_version, ETHTOOL_FWVERS_LEN, "N/A");
54 sprintf(info->bus_info, "%s", pdev->name);
55}
56
57static int xgene_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
58{
59 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
60 struct phy_device *phydev = pdata->phy_dev;
61
62 if (phydev == NULL)
63 return -ENODEV;
64
65 return phy_ethtool_gset(phydev, cmd);
66}
67
68static int xgene_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
69{
70 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
71 struct phy_device *phydev = pdata->phy_dev;
72
73 if (phydev == NULL)
74 return -ENODEV;
75
76 return phy_ethtool_sset(phydev, cmd);
77}
78
79static void xgene_get_strings(struct net_device *ndev, u32 stringset, u8 *data)
80{
81 int i;
82 u8 *p = data;
83
84 if (stringset != ETH_SS_STATS)
85 return;
86
87 for (i = 0; i < XGENE_STATS_LEN; i++) {
88 memcpy(p, gstrings_stats[i].name, ETH_GSTRING_LEN);
89 p += ETH_GSTRING_LEN;
90 }
91}
92
93static int xgene_get_sset_count(struct net_device *ndev, int sset)
94{
95 if (sset != ETH_SS_STATS)
96 return -EINVAL;
97
98 return XGENE_STATS_LEN;
99}
100
101static void xgene_get_ethtool_stats(struct net_device *ndev,
102 struct ethtool_stats *dummy,
103 u64 *data)
104{
105 void *pdata = netdev_priv(ndev);
106 int i;
107
108 for (i = 0; i < XGENE_STATS_LEN; i++)
109 *data++ = *(u64 *)(pdata + gstrings_stats[i].offset);
110}
111
112static const struct ethtool_ops xgene_ethtool_ops = {
113 .get_drvinfo = xgene_get_drvinfo,
114 .get_settings = xgene_get_settings,
115 .set_settings = xgene_set_settings,
116 .get_link = ethtool_op_get_link,
117 .get_strings = xgene_get_strings,
118 .get_sset_count = xgene_get_sset_count,
119 .get_ethtool_stats = xgene_get_ethtool_stats
120};
121
122void xgene_enet_set_ethtool_ops(struct net_device *ndev)
123{
124 ndev->ethtool_ops = &xgene_ethtool_ops;
125}
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
new file mode 100644
index 000000000000..812d8d65159b
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
@@ -0,0 +1,728 @@
1/* Applied Micro X-Gene SoC Ethernet Driver
2 *
3 * Copyright (c) 2014, Applied Micro Circuits Corporation
4 * Authors: Iyappan Subramanian <isubramanian@apm.com>
5 * Ravi Patel <rapatel@apm.com>
6 * Keyur Chudgar <kchudgar@apm.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#include "xgene_enet_main.h"
23#include "xgene_enet_hw.h"
24
25static void xgene_enet_ring_init(struct xgene_enet_desc_ring *ring)
26{
27 u32 *ring_cfg = ring->state;
28 u64 addr = ring->dma;
29 enum xgene_enet_ring_cfgsize cfgsize = ring->cfgsize;
30
31 ring_cfg[4] |= (1 << SELTHRSH_POS) &
32 CREATE_MASK(SELTHRSH_POS, SELTHRSH_LEN);
33 ring_cfg[3] |= ACCEPTLERR;
34 ring_cfg[2] |= QCOHERENT;
35
36 addr >>= 8;
37 ring_cfg[2] |= (addr << RINGADDRL_POS) &
38 CREATE_MASK_ULL(RINGADDRL_POS, RINGADDRL_LEN);
39 addr >>= RINGADDRL_LEN;
40 ring_cfg[3] |= addr & CREATE_MASK_ULL(RINGADDRH_POS, RINGADDRH_LEN);
41 ring_cfg[3] |= ((u32)cfgsize << RINGSIZE_POS) &
42 CREATE_MASK(RINGSIZE_POS, RINGSIZE_LEN);
43}
44
45static void xgene_enet_ring_set_type(struct xgene_enet_desc_ring *ring)
46{
47 u32 *ring_cfg = ring->state;
48 bool is_bufpool;
49 u32 val;
50
51 is_bufpool = xgene_enet_is_bufpool(ring->id);
52 val = (is_bufpool) ? RING_BUFPOOL : RING_REGULAR;
53 ring_cfg[4] |= (val << RINGTYPE_POS) &
54 CREATE_MASK(RINGTYPE_POS, RINGTYPE_LEN);
55
56 if (is_bufpool) {
57 ring_cfg[3] |= (BUFPOOL_MODE << RINGMODE_POS) &
58 CREATE_MASK(RINGMODE_POS, RINGMODE_LEN);
59 }
60}
61
62static void xgene_enet_ring_set_recombbuf(struct xgene_enet_desc_ring *ring)
63{
64 u32 *ring_cfg = ring->state;
65
66 ring_cfg[3] |= RECOMBBUF;
67 ring_cfg[3] |= (0xf << RECOMTIMEOUTL_POS) &
68 CREATE_MASK(RECOMTIMEOUTL_POS, RECOMTIMEOUTL_LEN);
69 ring_cfg[4] |= 0x7 & CREATE_MASK(RECOMTIMEOUTH_POS, RECOMTIMEOUTH_LEN);
70}
71
72static void xgene_enet_ring_wr32(struct xgene_enet_desc_ring *ring,
73 u32 offset, u32 data)
74{
75 struct xgene_enet_pdata *pdata = netdev_priv(ring->ndev);
76
77 iowrite32(data, pdata->ring_csr_addr + offset);
78}
79
80static void xgene_enet_ring_rd32(struct xgene_enet_desc_ring *ring,
81 u32 offset, u32 *data)
82{
83 struct xgene_enet_pdata *pdata = netdev_priv(ring->ndev);
84
85 *data = ioread32(pdata->ring_csr_addr + offset);
86}
87
88static void xgene_enet_write_ring_state(struct xgene_enet_desc_ring *ring)
89{
90 int i;
91
92 xgene_enet_ring_wr32(ring, CSR_RING_CONFIG, ring->num);
93 for (i = 0; i < NUM_RING_CONFIG; i++) {
94 xgene_enet_ring_wr32(ring, CSR_RING_WR_BASE + (i * 4),
95 ring->state[i]);
96 }
97}
98
99static void xgene_enet_clr_ring_state(struct xgene_enet_desc_ring *ring)
100{
101 memset(ring->state, 0, sizeof(u32) * NUM_RING_CONFIG);
102 xgene_enet_write_ring_state(ring);
103}
104
105static void xgene_enet_set_ring_state(struct xgene_enet_desc_ring *ring)
106{
107 xgene_enet_ring_set_type(ring);
108
109 if (xgene_enet_ring_owner(ring->id) == RING_OWNER_ETH0)
110 xgene_enet_ring_set_recombbuf(ring);
111
112 xgene_enet_ring_init(ring);
113 xgene_enet_write_ring_state(ring);
114}
115
116static void xgene_enet_set_ring_id(struct xgene_enet_desc_ring *ring)
117{
118 u32 ring_id_val, ring_id_buf;
119 bool is_bufpool;
120
121 is_bufpool = xgene_enet_is_bufpool(ring->id);
122
123 ring_id_val = ring->id & GENMASK(9, 0);
124 ring_id_val |= OVERWRITE;
125
126 ring_id_buf = (ring->num << 9) & GENMASK(18, 9);
127 ring_id_buf |= PREFETCH_BUF_EN;
128 if (is_bufpool)
129 ring_id_buf |= IS_BUFFER_POOL;
130
131 xgene_enet_ring_wr32(ring, CSR_RING_ID, ring_id_val);
132 xgene_enet_ring_wr32(ring, CSR_RING_ID_BUF, ring_id_buf);
133}
134
135static void xgene_enet_clr_desc_ring_id(struct xgene_enet_desc_ring *ring)
136{
137 u32 ring_id;
138
139 ring_id = ring->id | OVERWRITE;
140 xgene_enet_ring_wr32(ring, CSR_RING_ID, ring_id);
141 xgene_enet_ring_wr32(ring, CSR_RING_ID_BUF, 0);
142}
143
144struct xgene_enet_desc_ring *xgene_enet_setup_ring(
145 struct xgene_enet_desc_ring *ring)
146{
147 u32 size = ring->size;
148 u32 i, data;
149 bool is_bufpool;
150
151 xgene_enet_clr_ring_state(ring);
152 xgene_enet_set_ring_state(ring);
153 xgene_enet_set_ring_id(ring);
154
155 ring->slots = xgene_enet_get_numslots(ring->id, size);
156
157 is_bufpool = xgene_enet_is_bufpool(ring->id);
158 if (is_bufpool || xgene_enet_ring_owner(ring->id) != RING_OWNER_CPU)
159 return ring;
160
161 for (i = 0; i < ring->slots; i++)
162 xgene_enet_mark_desc_slot_empty(&ring->raw_desc[i]);
163
164 xgene_enet_ring_rd32(ring, CSR_RING_NE_INT_MODE, &data);
165 data |= BIT(31 - xgene_enet_ring_bufnum(ring->id));
166 xgene_enet_ring_wr32(ring, CSR_RING_NE_INT_MODE, data);
167
168 return ring;
169}
170
171void xgene_enet_clear_ring(struct xgene_enet_desc_ring *ring)
172{
173 u32 data;
174 bool is_bufpool;
175
176 is_bufpool = xgene_enet_is_bufpool(ring->id);
177 if (is_bufpool || xgene_enet_ring_owner(ring->id) != RING_OWNER_CPU)
178 goto out;
179
180 xgene_enet_ring_rd32(ring, CSR_RING_NE_INT_MODE, &data);
181 data &= ~BIT(31 - xgene_enet_ring_bufnum(ring->id));
182 xgene_enet_ring_wr32(ring, CSR_RING_NE_INT_MODE, data);
183
184out:
185 xgene_enet_clr_desc_ring_id(ring);
186 xgene_enet_clr_ring_state(ring);
187}
188
189void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring,
190 struct xgene_enet_pdata *pdata,
191 enum xgene_enet_err_code status)
192{
193 struct rtnl_link_stats64 *stats = &pdata->stats;
194
195 switch (status) {
196 case INGRESS_CRC:
197 stats->rx_crc_errors++;
198 break;
199 case INGRESS_CHECKSUM:
200 case INGRESS_CHECKSUM_COMPUTE:
201 stats->rx_errors++;
202 break;
203 case INGRESS_TRUNC_FRAME:
204 stats->rx_frame_errors++;
205 break;
206 case INGRESS_PKT_LEN:
207 stats->rx_length_errors++;
208 break;
209 case INGRESS_PKT_UNDER:
210 stats->rx_frame_errors++;
211 break;
212 case INGRESS_FIFO_OVERRUN:
213 stats->rx_fifo_errors++;
214 break;
215 default:
216 break;
217 }
218}
219
220static void xgene_enet_wr_csr(struct xgene_enet_pdata *pdata,
221 u32 offset, u32 val)
222{
223 void __iomem *addr = pdata->eth_csr_addr + offset;
224
225 iowrite32(val, addr);
226}
227
228static void xgene_enet_wr_ring_if(struct xgene_enet_pdata *pdata,
229 u32 offset, u32 val)
230{
231 void __iomem *addr = pdata->eth_ring_if_addr + offset;
232
233 iowrite32(val, addr);
234}
235
236static void xgene_enet_wr_diag_csr(struct xgene_enet_pdata *pdata,
237 u32 offset, u32 val)
238{
239 void __iomem *addr = pdata->eth_diag_csr_addr + offset;
240
241 iowrite32(val, addr);
242}
243
244static void xgene_enet_wr_mcx_csr(struct xgene_enet_pdata *pdata,
245 u32 offset, u32 val)
246{
247 void __iomem *addr = pdata->mcx_mac_csr_addr + offset;
248
249 iowrite32(val, addr);
250}
251
252static bool xgene_enet_wr_indirect(void __iomem *addr, void __iomem *wr,
253 void __iomem *cmd, void __iomem *cmd_done,
254 u32 wr_addr, u32 wr_data)
255{
256 u32 done;
257 u8 wait = 10;
258
259 iowrite32(wr_addr, addr);
260 iowrite32(wr_data, wr);
261 iowrite32(XGENE_ENET_WR_CMD, cmd);
262
263 /* wait for write command to complete */
264 while (!(done = ioread32(cmd_done)) && wait--)
265 udelay(1);
266
267 if (!done)
268 return false;
269
270 iowrite32(0, cmd);
271
272 return true;
273}
274
275static void xgene_enet_wr_mcx_mac(struct xgene_enet_pdata *pdata,
276 u32 wr_addr, u32 wr_data)
277{
278 void __iomem *addr, *wr, *cmd, *cmd_done;
279
280 addr = pdata->mcx_mac_addr + MAC_ADDR_REG_OFFSET;
281 wr = pdata->mcx_mac_addr + MAC_WRITE_REG_OFFSET;
282 cmd = pdata->mcx_mac_addr + MAC_COMMAND_REG_OFFSET;
283 cmd_done = pdata->mcx_mac_addr + MAC_COMMAND_DONE_REG_OFFSET;
284
285 if (!xgene_enet_wr_indirect(addr, wr, cmd, cmd_done, wr_addr, wr_data))
286 netdev_err(pdata->ndev, "MCX mac write failed, addr: %04x\n",
287 wr_addr);
288}
289
290static void xgene_enet_rd_csr(struct xgene_enet_pdata *pdata,
291 u32 offset, u32 *val)
292{
293 void __iomem *addr = pdata->eth_csr_addr + offset;
294
295 *val = ioread32(addr);
296}
297
298static void xgene_enet_rd_diag_csr(struct xgene_enet_pdata *pdata,
299 u32 offset, u32 *val)
300{
301 void __iomem *addr = pdata->eth_diag_csr_addr + offset;
302
303 *val = ioread32(addr);
304}
305
306static void xgene_enet_rd_mcx_csr(struct xgene_enet_pdata *pdata,
307 u32 offset, u32 *val)
308{
309 void __iomem *addr = pdata->mcx_mac_csr_addr + offset;
310
311 *val = ioread32(addr);
312}
313
314static bool xgene_enet_rd_indirect(void __iomem *addr, void __iomem *rd,
315 void __iomem *cmd, void __iomem *cmd_done,
316 u32 rd_addr, u32 *rd_data)
317{
318 u32 done;
319 u8 wait = 10;
320
321 iowrite32(rd_addr, addr);
322 iowrite32(XGENE_ENET_RD_CMD, cmd);
323
324 /* wait for read command to complete */
325 while (!(done = ioread32(cmd_done)) && wait--)
326 udelay(1);
327
328 if (!done)
329 return false;
330
331 *rd_data = ioread32(rd);
332 iowrite32(0, cmd);
333
334 return true;
335}
336
337static void xgene_enet_rd_mcx_mac(struct xgene_enet_pdata *pdata,
338 u32 rd_addr, u32 *rd_data)
339{
340 void __iomem *addr, *rd, *cmd, *cmd_done;
341
342 addr = pdata->mcx_mac_addr + MAC_ADDR_REG_OFFSET;
343 rd = pdata->mcx_mac_addr + MAC_READ_REG_OFFSET;
344 cmd = pdata->mcx_mac_addr + MAC_COMMAND_REG_OFFSET;
345 cmd_done = pdata->mcx_mac_addr + MAC_COMMAND_DONE_REG_OFFSET;
346
347 if (!xgene_enet_rd_indirect(addr, rd, cmd, cmd_done, rd_addr, rd_data))
348 netdev_err(pdata->ndev, "MCX mac read failed, addr: %04x\n",
349 rd_addr);
350}
351
352static int xgene_mii_phy_write(struct xgene_enet_pdata *pdata, int phy_id,
353 u32 reg, u16 data)
354{
355 u32 addr = 0, wr_data = 0;
356 u32 done;
357 u8 wait = 10;
358
359 PHY_ADDR_SET(&addr, phy_id);
360 REG_ADDR_SET(&addr, reg);
361 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_ADDRESS_ADDR, addr);
362
363 PHY_CONTROL_SET(&wr_data, data);
364 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_CONTROL_ADDR, wr_data);
365 do {
366 usleep_range(5, 10);
367 xgene_enet_rd_mcx_mac(pdata, MII_MGMT_INDICATORS_ADDR, &done);
368 } while ((done & BUSY_MASK) && wait--);
369
370 if (done & BUSY_MASK) {
371 netdev_err(pdata->ndev, "MII_MGMT write failed\n");
372 return -EBUSY;
373 }
374
375 return 0;
376}
377
378static int xgene_mii_phy_read(struct xgene_enet_pdata *pdata,
379 u8 phy_id, u32 reg)
380{
381 u32 addr = 0;
382 u32 data, done;
383 u8 wait = 10;
384
385 PHY_ADDR_SET(&addr, phy_id);
386 REG_ADDR_SET(&addr, reg);
387 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_ADDRESS_ADDR, addr);
388 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_COMMAND_ADDR, READ_CYCLE_MASK);
389 do {
390 usleep_range(5, 10);
391 xgene_enet_rd_mcx_mac(pdata, MII_MGMT_INDICATORS_ADDR, &done);
392 } while ((done & BUSY_MASK) && wait--);
393
394 if (done & BUSY_MASK) {
395 netdev_err(pdata->ndev, "MII_MGMT read failed\n");
396 return -EBUSY;
397 }
398
399 xgene_enet_rd_mcx_mac(pdata, MII_MGMT_STATUS_ADDR, &data);
400 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_COMMAND_ADDR, 0);
401
402 return data;
403}
404
405void xgene_gmac_set_mac_addr(struct xgene_enet_pdata *pdata)
406{
407 u32 addr0, addr1;
408 u8 *dev_addr = pdata->ndev->dev_addr;
409
410 addr0 = (dev_addr[3] << 24) | (dev_addr[2] << 16) |
411 (dev_addr[1] << 8) | dev_addr[0];
412 addr1 = (dev_addr[5] << 24) | (dev_addr[4] << 16);
413 addr1 |= pdata->phy_addr & 0xFFFF;
414
415 xgene_enet_wr_mcx_mac(pdata, STATION_ADDR0_ADDR, addr0);
416 xgene_enet_wr_mcx_mac(pdata, STATION_ADDR1_ADDR, addr1);
417}
418
419static int xgene_enet_ecc_init(struct xgene_enet_pdata *pdata)
420{
421 struct net_device *ndev = pdata->ndev;
422 u32 data;
423 u8 wait = 10;
424
425 xgene_enet_wr_diag_csr(pdata, ENET_CFG_MEM_RAM_SHUTDOWN_ADDR, 0x0);
426 do {
427 usleep_range(100, 110);
428 xgene_enet_rd_diag_csr(pdata, ENET_BLOCK_MEM_RDY_ADDR, &data);
429 } while ((data != 0xffffffff) && wait--);
430
431 if (data != 0xffffffff) {
432 netdev_err(ndev, "Failed to release memory from shutdown\n");
433 return -ENODEV;
434 }
435
436 return 0;
437}
438
439void xgene_gmac_reset(struct xgene_enet_pdata *pdata)
440{
441 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, SOFT_RESET1);
442 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, 0);
443}
444
445void xgene_gmac_init(struct xgene_enet_pdata *pdata, int speed)
446{
447 u32 value, mc2;
448 u32 intf_ctl, rgmii;
449 u32 icm0, icm2;
450
451 xgene_gmac_reset(pdata);
452
453 xgene_enet_rd_mcx_csr(pdata, ICM_CONFIG0_REG_0_ADDR, &icm0);
454 xgene_enet_rd_mcx_csr(pdata, ICM_CONFIG2_REG_0_ADDR, &icm2);
455 xgene_enet_rd_mcx_mac(pdata, MAC_CONFIG_2_ADDR, &mc2);
456 xgene_enet_rd_mcx_mac(pdata, INTERFACE_CONTROL_ADDR, &intf_ctl);
457 xgene_enet_rd_csr(pdata, RGMII_REG_0_ADDR, &rgmii);
458
459 switch (speed) {
460 case SPEED_10:
461 ENET_INTERFACE_MODE2_SET(&mc2, 1);
462 CFG_MACMODE_SET(&icm0, 0);
463 CFG_WAITASYNCRD_SET(&icm2, 500);
464 rgmii &= ~CFG_SPEED_1250;
465 break;
466 case SPEED_100:
467 ENET_INTERFACE_MODE2_SET(&mc2, 1);
468 intf_ctl |= ENET_LHD_MODE;
469 CFG_MACMODE_SET(&icm0, 1);
470 CFG_WAITASYNCRD_SET(&icm2, 80);
471 rgmii &= ~CFG_SPEED_1250;
472 break;
473 default:
474 ENET_INTERFACE_MODE2_SET(&mc2, 2);
475 intf_ctl |= ENET_GHD_MODE;
476 CFG_TXCLK_MUXSEL0_SET(&rgmii, 4);
477 xgene_enet_rd_csr(pdata, DEBUG_REG_ADDR, &value);
478 value |= CFG_BYPASS_UNISEC_TX | CFG_BYPASS_UNISEC_RX;
479 xgene_enet_wr_csr(pdata, DEBUG_REG_ADDR, value);
480 break;
481 }
482
483 mc2 |= FULL_DUPLEX2;
484 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_2_ADDR, mc2);
485 xgene_enet_wr_mcx_mac(pdata, INTERFACE_CONTROL_ADDR, intf_ctl);
486
487 xgene_gmac_set_mac_addr(pdata);
488
489 /* Adjust MDC clock frequency */
490 xgene_enet_rd_mcx_mac(pdata, MII_MGMT_CONFIG_ADDR, &value);
491 MGMT_CLOCK_SEL_SET(&value, 7);
492 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_CONFIG_ADDR, value);
493
494 /* Enable drop if bufpool not available */
495 xgene_enet_rd_csr(pdata, RSIF_CONFIG_REG_ADDR, &value);
496 value |= CFG_RSIF_FPBUFF_TIMEOUT_EN;
497 xgene_enet_wr_csr(pdata, RSIF_CONFIG_REG_ADDR, value);
498
499 /* Rtype should be copied from FP */
500 xgene_enet_wr_csr(pdata, RSIF_RAM_DBG_REG0_ADDR, 0);
501 xgene_enet_wr_csr(pdata, RGMII_REG_0_ADDR, rgmii);
502
503 /* Rx-Tx traffic resume */
504 xgene_enet_wr_csr(pdata, CFG_LINK_AGGR_RESUME_0_ADDR, TX_PORT0);
505
506 xgene_enet_wr_mcx_csr(pdata, ICM_CONFIG0_REG_0_ADDR, icm0);
507 xgene_enet_wr_mcx_csr(pdata, ICM_CONFIG2_REG_0_ADDR, icm2);
508
509 xgene_enet_rd_mcx_csr(pdata, RX_DV_GATE_REG_0_ADDR, &value);
510 value &= ~TX_DV_GATE_EN0;
511 value &= ~RX_DV_GATE_EN0;
512 value |= RESUME_RX0;
513 xgene_enet_wr_mcx_csr(pdata, RX_DV_GATE_REG_0_ADDR, value);
514
515 xgene_enet_wr_csr(pdata, CFG_BYPASS_ADDR, RESUME_TX);
516}
517
518static void xgene_enet_config_ring_if_assoc(struct xgene_enet_pdata *pdata)
519{
520 u32 val = 0xffffffff;
521
522 xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIWQASSOC_ADDR, val);
523 xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIFPQASSOC_ADDR, val);
524 xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIQMLITEWQASSOC_ADDR, val);
525 xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIQMLITEFPQASSOC_ADDR, val);
526}
527
528void xgene_enet_cle_bypass(struct xgene_enet_pdata *pdata,
529 u32 dst_ring_num, u16 bufpool_id)
530{
531 u32 cb;
532 u32 fpsel;
533
534 fpsel = xgene_enet_ring_bufnum(bufpool_id) - 0x20;
535
536 xgene_enet_rd_csr(pdata, CLE_BYPASS_REG0_0_ADDR, &cb);
537 cb |= CFG_CLE_BYPASS_EN0;
538 CFG_CLE_IP_PROTOCOL0_SET(&cb, 3);
539 xgene_enet_wr_csr(pdata, CLE_BYPASS_REG0_0_ADDR, cb);
540
541 xgene_enet_rd_csr(pdata, CLE_BYPASS_REG1_0_ADDR, &cb);
542 CFG_CLE_DSTQID0_SET(&cb, dst_ring_num);
543 CFG_CLE_FPSEL0_SET(&cb, fpsel);
544 xgene_enet_wr_csr(pdata, CLE_BYPASS_REG1_0_ADDR, cb);
545}
546
547void xgene_gmac_rx_enable(struct xgene_enet_pdata *pdata)
548{
549 u32 data;
550
551 xgene_enet_rd_mcx_mac(pdata, MAC_CONFIG_1_ADDR, &data);
552 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, data | RX_EN);
553}
554
555void xgene_gmac_tx_enable(struct xgene_enet_pdata *pdata)
556{
557 u32 data;
558
559 xgene_enet_rd_mcx_mac(pdata, MAC_CONFIG_1_ADDR, &data);
560 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, data | TX_EN);
561}
562
563void xgene_gmac_rx_disable(struct xgene_enet_pdata *pdata)
564{
565 u32 data;
566
567 xgene_enet_rd_mcx_mac(pdata, MAC_CONFIG_1_ADDR, &data);
568 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, data & ~RX_EN);
569}
570
571void xgene_gmac_tx_disable(struct xgene_enet_pdata *pdata)
572{
573 u32 data;
574
575 xgene_enet_rd_mcx_mac(pdata, MAC_CONFIG_1_ADDR, &data);
576 xgene_enet_wr_mcx_mac(pdata, MAC_CONFIG_1_ADDR, data & ~TX_EN);
577}
578
579void xgene_enet_reset(struct xgene_enet_pdata *pdata)
580{
581 u32 val;
582
583 clk_prepare_enable(pdata->clk);
584 clk_disable_unprepare(pdata->clk);
585 clk_prepare_enable(pdata->clk);
586 xgene_enet_ecc_init(pdata);
587 xgene_enet_config_ring_if_assoc(pdata);
588
589 /* Enable auto-incr for scanning */
590 xgene_enet_rd_mcx_mac(pdata, MII_MGMT_CONFIG_ADDR, &val);
591 val |= SCAN_AUTO_INCR;
592 MGMT_CLOCK_SEL_SET(&val, 1);
593 xgene_enet_wr_mcx_mac(pdata, MII_MGMT_CONFIG_ADDR, val);
594}
595
596void xgene_gport_shutdown(struct xgene_enet_pdata *pdata)
597{
598 clk_disable_unprepare(pdata->clk);
599}
600
601static int xgene_enet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
602{
603 struct xgene_enet_pdata *pdata = bus->priv;
604 u32 val;
605
606 val = xgene_mii_phy_read(pdata, mii_id, regnum);
607 netdev_dbg(pdata->ndev, "mdio_rd: bus=%d reg=%d val=%x\n",
608 mii_id, regnum, val);
609
610 return val;
611}
612
613static int xgene_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
614 u16 val)
615{
616 struct xgene_enet_pdata *pdata = bus->priv;
617
618 netdev_dbg(pdata->ndev, "mdio_wr: bus=%d reg=%d val=%x\n",
619 mii_id, regnum, val);
620 return xgene_mii_phy_write(pdata, mii_id, regnum, val);
621}
622
623static void xgene_enet_adjust_link(struct net_device *ndev)
624{
625 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
626 struct phy_device *phydev = pdata->phy_dev;
627
628 if (phydev->link) {
629 if (pdata->phy_speed != phydev->speed) {
630 xgene_gmac_init(pdata, phydev->speed);
631 xgene_gmac_rx_enable(pdata);
632 xgene_gmac_tx_enable(pdata);
633 pdata->phy_speed = phydev->speed;
634 phy_print_status(phydev);
635 }
636 } else {
637 xgene_gmac_rx_disable(pdata);
638 xgene_gmac_tx_disable(pdata);
639 pdata->phy_speed = SPEED_UNKNOWN;
640 phy_print_status(phydev);
641 }
642}
643
644static int xgene_enet_phy_connect(struct net_device *ndev)
645{
646 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
647 struct device_node *phy_np;
648 struct phy_device *phy_dev;
649 struct device *dev = &pdata->pdev->dev;
650
651 phy_np = of_parse_phandle(dev->of_node, "phy-handle", 0);
652 if (!phy_np) {
653 netdev_dbg(ndev, "No phy-handle found\n");
654 return -ENODEV;
655 }
656
657 phy_dev = of_phy_connect(ndev, phy_np, &xgene_enet_adjust_link,
658 0, pdata->phy_mode);
659 if (!phy_dev) {
660 netdev_err(ndev, "Could not connect to PHY\n");
661 return -ENODEV;
662 }
663
664 pdata->phy_speed = SPEED_UNKNOWN;
665 phy_dev->supported &= ~SUPPORTED_10baseT_Half &
666 ~SUPPORTED_100baseT_Half &
667 ~SUPPORTED_1000baseT_Half;
668 phy_dev->advertising = phy_dev->supported;
669 pdata->phy_dev = phy_dev;
670
671 return 0;
672}
673
674int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata)
675{
676 struct net_device *ndev = pdata->ndev;
677 struct device *dev = &pdata->pdev->dev;
678 struct device_node *child_np;
679 struct device_node *mdio_np = NULL;
680 struct mii_bus *mdio_bus;
681 int ret;
682
683 for_each_child_of_node(dev->of_node, child_np) {
684 if (of_device_is_compatible(child_np, "apm,xgene-mdio")) {
685 mdio_np = child_np;
686 break;
687 }
688 }
689
690 if (!mdio_np) {
691 netdev_dbg(ndev, "No mdio node in the dts\n");
692 return -ENXIO;
693 }
694
695 mdio_bus = mdiobus_alloc();
696 if (!mdio_bus)
697 return -ENOMEM;
698
699 mdio_bus->name = "APM X-Gene MDIO bus";
700 mdio_bus->read = xgene_enet_mdio_read;
701 mdio_bus->write = xgene_enet_mdio_write;
702 snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%s-%s", "xgene-mii",
703 ndev->name);
704
705 mdio_bus->priv = pdata;
706 mdio_bus->parent = &ndev->dev;
707
708 ret = of_mdiobus_register(mdio_bus, mdio_np);
709 if (ret) {
710 netdev_err(ndev, "Failed to register MDIO bus\n");
711 mdiobus_free(mdio_bus);
712 return ret;
713 }
714 pdata->mdio_bus = mdio_bus;
715
716 ret = xgene_enet_phy_connect(ndev);
717 if (ret)
718 xgene_enet_mdio_remove(pdata);
719
720 return ret;
721}
722
723void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata)
724{
725 mdiobus_unregister(pdata->mdio_bus);
726 mdiobus_free(pdata->mdio_bus);
727 pdata->mdio_bus = NULL;
728}
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
new file mode 100644
index 000000000000..371e7a5b2507
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
@@ -0,0 +1,337 @@
1/* Applied Micro X-Gene SoC Ethernet Driver
2 *
3 * Copyright (c) 2014, Applied Micro Circuits Corporation
4 * Authors: Iyappan Subramanian <isubramanian@apm.com>
5 * Ravi Patel <rapatel@apm.com>
6 * Keyur Chudgar <kchudgar@apm.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifndef __XGENE_ENET_HW_H__
23#define __XGENE_ENET_HW_H__
24
25#include "xgene_enet_main.h"
26
27struct xgene_enet_pdata;
28struct xgene_enet_stats;
29
30/* clears and then set bits */
31static inline void xgene_set_bits(u32 *dst, u32 val, u32 start, u32 len)
32{
33 u32 end = start + len - 1;
34 u32 mask = GENMASK(end, start);
35
36 *dst &= ~mask;
37 *dst |= (val << start) & mask;
38}
39
40static inline u32 xgene_get_bits(u32 val, u32 start, u32 end)
41{
42 return (val & GENMASK(end, start)) >> start;
43}
44
45#define CSR_RING_ID 0x0008
46#define OVERWRITE BIT(31)
47#define IS_BUFFER_POOL BIT(20)
48#define PREFETCH_BUF_EN BIT(21)
49#define CSR_RING_ID_BUF 0x000c
50#define CSR_RING_NE_INT_MODE 0x017c
51#define CSR_RING_CONFIG 0x006c
52#define CSR_RING_WR_BASE 0x0070
53#define NUM_RING_CONFIG 5
54#define BUFPOOL_MODE 3
55#define RM3 3
56#define INC_DEC_CMD_ADDR 0x002c
57#define UDP_HDR_SIZE 2
58#define BUF_LEN_CODE_2K 0x5000
59
60#define CREATE_MASK(pos, len) GENMASK((pos)+(len)-1, (pos))
61#define CREATE_MASK_ULL(pos, len) GENMASK_ULL((pos)+(len)-1, (pos))
62
63/* Empty slot soft signature */
64#define EMPTY_SLOT_INDEX 1
65#define EMPTY_SLOT ~0ULL
66
67#define WORK_DESC_SIZE 32
68#define BUFPOOL_DESC_SIZE 16
69
70#define RING_OWNER_MASK GENMASK(9, 6)
71#define RING_BUFNUM_MASK GENMASK(5, 0)
72
73#define SELTHRSH_POS 3
74#define SELTHRSH_LEN 3
75#define RINGADDRL_POS 5
76#define RINGADDRL_LEN 27
77#define RINGADDRH_POS 0
78#define RINGADDRH_LEN 6
79#define RINGSIZE_POS 23
80#define RINGSIZE_LEN 3
81#define RINGTYPE_POS 19
82#define RINGTYPE_LEN 2
83#define RINGMODE_POS 20
84#define RINGMODE_LEN 3
85#define RECOMTIMEOUTL_POS 28
86#define RECOMTIMEOUTL_LEN 3
87#define RECOMTIMEOUTH_POS 0
88#define RECOMTIMEOUTH_LEN 2
89#define NUMMSGSINQ_POS 1
90#define NUMMSGSINQ_LEN 16
91#define ACCEPTLERR BIT(19)
92#define QCOHERENT BIT(4)
93#define RECOMBBUF BIT(27)
94
95#define BLOCK_ETH_CSR_OFFSET 0x2000
96#define BLOCK_ETH_RING_IF_OFFSET 0x9000
97#define BLOCK_ETH_CLKRST_CSR_OFFSET 0xC000
98#define BLOCK_ETH_DIAG_CSR_OFFSET 0xD000
99
100#define BLOCK_ETH_MAC_OFFSET 0x0000
101#define BLOCK_ETH_STATS_OFFSET 0x0014
102#define BLOCK_ETH_MAC_CSR_OFFSET 0x2800
103
104#define MAC_ADDR_REG_OFFSET 0x00
105#define MAC_COMMAND_REG_OFFSET 0x04
106#define MAC_WRITE_REG_OFFSET 0x08
107#define MAC_READ_REG_OFFSET 0x0c
108#define MAC_COMMAND_DONE_REG_OFFSET 0x10
109
110#define STAT_ADDR_REG_OFFSET 0x00
111#define STAT_COMMAND_REG_OFFSET 0x04
112#define STAT_WRITE_REG_OFFSET 0x08
113#define STAT_READ_REG_OFFSET 0x0c
114#define STAT_COMMAND_DONE_REG_OFFSET 0x10
115
116#define MII_MGMT_CONFIG_ADDR 0x20
117#define MII_MGMT_COMMAND_ADDR 0x24
118#define MII_MGMT_ADDRESS_ADDR 0x28
119#define MII_MGMT_CONTROL_ADDR 0x2c
120#define MII_MGMT_STATUS_ADDR 0x30
121#define MII_MGMT_INDICATORS_ADDR 0x34
122
123#define BUSY_MASK BIT(0)
124#define READ_CYCLE_MASK BIT(0)
125#define PHY_CONTROL_SET(dst, val) xgene_set_bits(dst, val, 0, 16)
126
127#define ENET_SPARE_CFG_REG_ADDR 0x0750
128#define RSIF_CONFIG_REG_ADDR 0x0010
129#define RSIF_RAM_DBG_REG0_ADDR 0x0048
130#define RGMII_REG_0_ADDR 0x07e0
131#define CFG_LINK_AGGR_RESUME_0_ADDR 0x07c8
132#define DEBUG_REG_ADDR 0x0700
133#define CFG_BYPASS_ADDR 0x0294
134#define CLE_BYPASS_REG0_0_ADDR 0x0490
135#define CLE_BYPASS_REG1_0_ADDR 0x0494
136#define CFG_RSIF_FPBUFF_TIMEOUT_EN BIT(31)
137#define RESUME_TX BIT(0)
138#define CFG_SPEED_1250 BIT(24)
139#define TX_PORT0 BIT(0)
140#define CFG_BYPASS_UNISEC_TX BIT(2)
141#define CFG_BYPASS_UNISEC_RX BIT(1)
142#define CFG_CLE_BYPASS_EN0 BIT(31)
143#define CFG_TXCLK_MUXSEL0_SET(dst, val) xgene_set_bits(dst, val, 29, 3)
144
145#define CFG_CLE_IP_PROTOCOL0_SET(dst, val) xgene_set_bits(dst, val, 16, 2)
146#define CFG_CLE_DSTQID0_SET(dst, val) xgene_set_bits(dst, val, 0, 12)
147#define CFG_CLE_FPSEL0_SET(dst, val) xgene_set_bits(dst, val, 16, 4)
148#define CFG_MACMODE_SET(dst, val) xgene_set_bits(dst, val, 18, 2)
149#define CFG_WAITASYNCRD_SET(dst, val) xgene_set_bits(dst, val, 0, 16)
150#define ICM_CONFIG0_REG_0_ADDR 0x0400
151#define ICM_CONFIG2_REG_0_ADDR 0x0410
152#define RX_DV_GATE_REG_0_ADDR 0x05fc
153#define TX_DV_GATE_EN0 BIT(2)
154#define RX_DV_GATE_EN0 BIT(1)
155#define RESUME_RX0 BIT(0)
156#define ENET_CFGSSQMIWQASSOC_ADDR 0xe0
157#define ENET_CFGSSQMIFPQASSOC_ADDR 0xdc
158#define ENET_CFGSSQMIQMLITEFPQASSOC_ADDR 0xf0
159#define ENET_CFGSSQMIQMLITEWQASSOC_ADDR 0xf4
160#define ENET_CFG_MEM_RAM_SHUTDOWN_ADDR 0x70
161#define ENET_BLOCK_MEM_RDY_ADDR 0x74
162#define MAC_CONFIG_1_ADDR 0x00
163#define MAC_CONFIG_2_ADDR 0x04
164#define MAX_FRAME_LEN_ADDR 0x10
165#define INTERFACE_CONTROL_ADDR 0x38
166#define STATION_ADDR0_ADDR 0x40
167#define STATION_ADDR1_ADDR 0x44
168#define PHY_ADDR_SET(dst, val) xgene_set_bits(dst, val, 8, 5)
169#define REG_ADDR_SET(dst, val) xgene_set_bits(dst, val, 0, 5)
170#define ENET_INTERFACE_MODE2_SET(dst, val) xgene_set_bits(dst, val, 8, 2)
171#define MGMT_CLOCK_SEL_SET(dst, val) xgene_set_bits(dst, val, 0, 3)
172#define SOFT_RESET1 BIT(31)
173#define TX_EN BIT(0)
174#define RX_EN BIT(2)
175#define ENET_LHD_MODE BIT(25)
176#define ENET_GHD_MODE BIT(26)
177#define FULL_DUPLEX2 BIT(0)
178#define SCAN_AUTO_INCR BIT(5)
179#define TBYT_ADDR 0x38
180#define TPKT_ADDR 0x39
181#define TDRP_ADDR 0x45
182#define TFCS_ADDR 0x47
183#define TUND_ADDR 0x4a
184
185#define TSO_IPPROTO_TCP 1
186#define FULL_DUPLEX 2
187
188#define USERINFO_POS 0
189#define USERINFO_LEN 32
190#define FPQNUM_POS 32
191#define FPQNUM_LEN 12
192#define LERR_POS 60
193#define LERR_LEN 3
194#define STASH_POS 52
195#define STASH_LEN 2
196#define BUFDATALEN_POS 48
197#define BUFDATALEN_LEN 12
198#define DATAADDR_POS 0
199#define DATAADDR_LEN 42
200#define COHERENT_POS 63
201#define HENQNUM_POS 48
202#define HENQNUM_LEN 12
203#define TYPESEL_POS 44
204#define TYPESEL_LEN 4
205#define ETHHDR_POS 12
206#define ETHHDR_LEN 8
207#define IC_POS 35 /* Insert CRC */
208#define TCPHDR_POS 0
209#define TCPHDR_LEN 6
210#define IPHDR_POS 6
211#define IPHDR_LEN 6
212#define EC_POS 22 /* Enable checksum */
213#define EC_LEN 1
214#define IS_POS 24 /* IP protocol select */
215#define IS_LEN 1
216#define TYPE_ETH_WORK_MESSAGE_POS 44
217
218struct xgene_enet_raw_desc {
219 __le64 m0;
220 __le64 m1;
221 __le64 m2;
222 __le64 m3;
223};
224
225struct xgene_enet_raw_desc16 {
226 __le64 m0;
227 __le64 m1;
228};
229
230static inline void xgene_enet_mark_desc_slot_empty(void *desc_slot_ptr)
231{
232 __le64 *desc_slot = desc_slot_ptr;
233
234 desc_slot[EMPTY_SLOT_INDEX] = cpu_to_le64(EMPTY_SLOT);
235}
236
237static inline bool xgene_enet_is_desc_slot_empty(void *desc_slot_ptr)
238{
239 __le64 *desc_slot = desc_slot_ptr;
240
241 return (desc_slot[EMPTY_SLOT_INDEX] == cpu_to_le64(EMPTY_SLOT));
242}
243
244enum xgene_enet_ring_cfgsize {
245 RING_CFGSIZE_512B,
246 RING_CFGSIZE_2KB,
247 RING_CFGSIZE_16KB,
248 RING_CFGSIZE_64KB,
249 RING_CFGSIZE_512KB,
250 RING_CFGSIZE_INVALID
251};
252
253enum xgene_enet_ring_type {
254 RING_DISABLED,
255 RING_REGULAR,
256 RING_BUFPOOL
257};
258
259enum xgene_ring_owner {
260 RING_OWNER_ETH0,
261 RING_OWNER_CPU = 15,
262 RING_OWNER_INVALID
263};
264
265enum xgene_enet_ring_bufnum {
266 RING_BUFNUM_REGULAR = 0x0,
267 RING_BUFNUM_BUFPOOL = 0x20,
268 RING_BUFNUM_INVALID
269};
270
271enum xgene_enet_cmd {
272 XGENE_ENET_WR_CMD = BIT(31),
273 XGENE_ENET_RD_CMD = BIT(30)
274};
275
276enum xgene_enet_err_code {
277 HBF_READ_DATA = 3,
278 HBF_LL_READ = 4,
279 BAD_WORK_MSG = 6,
280 BUFPOOL_TIMEOUT = 15,
281 INGRESS_CRC = 16,
282 INGRESS_CHECKSUM = 17,
283 INGRESS_TRUNC_FRAME = 18,
284 INGRESS_PKT_LEN = 19,
285 INGRESS_PKT_UNDER = 20,
286 INGRESS_FIFO_OVERRUN = 21,
287 INGRESS_CHECKSUM_COMPUTE = 26,
288 ERR_CODE_INVALID
289};
290
291static inline enum xgene_ring_owner xgene_enet_ring_owner(u16 id)
292{
293 return (id & RING_OWNER_MASK) >> 6;
294}
295
296static inline u8 xgene_enet_ring_bufnum(u16 id)
297{
298 return id & RING_BUFNUM_MASK;
299}
300
301static inline bool xgene_enet_is_bufpool(u16 id)
302{
303 return ((id & RING_BUFNUM_MASK) >= 0x20) ? true : false;
304}
305
306static inline u16 xgene_enet_get_numslots(u16 id, u32 size)
307{
308 bool is_bufpool = xgene_enet_is_bufpool(id);
309
310 return (is_bufpool) ? size / BUFPOOL_DESC_SIZE :
311 size / WORK_DESC_SIZE;
312}
313
314struct xgene_enet_desc_ring *xgene_enet_setup_ring(
315 struct xgene_enet_desc_ring *ring);
316void xgene_enet_clear_ring(struct xgene_enet_desc_ring *ring);
317void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring,
318 struct xgene_enet_pdata *pdata,
319 enum xgene_enet_err_code status);
320
321void xgene_enet_reset(struct xgene_enet_pdata *priv);
322void xgene_gmac_reset(struct xgene_enet_pdata *priv);
323void xgene_gmac_init(struct xgene_enet_pdata *priv, int speed);
324void xgene_gmac_tx_enable(struct xgene_enet_pdata *priv);
325void xgene_gmac_rx_enable(struct xgene_enet_pdata *priv);
326void xgene_gmac_tx_disable(struct xgene_enet_pdata *priv);
327void xgene_gmac_rx_disable(struct xgene_enet_pdata *priv);
328void xgene_gmac_set_mac_addr(struct xgene_enet_pdata *pdata);
329void xgene_enet_cle_bypass(struct xgene_enet_pdata *pdata,
330 u32 dst_ring_num, u16 bufpool_id);
331void xgene_gport_shutdown(struct xgene_enet_pdata *priv);
332void xgene_gmac_get_tx_stats(struct xgene_enet_pdata *pdata);
333
334int xgene_enet_mdio_config(struct xgene_enet_pdata *pdata);
335void xgene_enet_mdio_remove(struct xgene_enet_pdata *pdata);
336
337#endif /* __XGENE_ENET_HW_H__ */
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
new file mode 100644
index 000000000000..af7c40ac1455
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -0,0 +1,951 @@
1/* Applied Micro X-Gene SoC Ethernet Driver
2 *
3 * Copyright (c) 2014, Applied Micro Circuits Corporation
4 * Authors: Iyappan Subramanian <isubramanian@apm.com>
5 * Ravi Patel <rapatel@apm.com>
6 * Keyur Chudgar <kchudgar@apm.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#include "xgene_enet_main.h"
23#include "xgene_enet_hw.h"
24
25static void xgene_enet_init_bufpool(struct xgene_enet_desc_ring *buf_pool)
26{
27 struct xgene_enet_raw_desc16 *raw_desc;
28 int i;
29
30 for (i = 0; i < buf_pool->slots; i++) {
31 raw_desc = &buf_pool->raw_desc16[i];
32
33 /* Hardware expects descriptor in little endian format */
34 raw_desc->m0 = cpu_to_le64(i |
35 SET_VAL(FPQNUM, buf_pool->dst_ring_num) |
36 SET_VAL(STASH, 3));
37 }
38}
39
40static int xgene_enet_refill_bufpool(struct xgene_enet_desc_ring *buf_pool,
41 u32 nbuf)
42{
43 struct sk_buff *skb;
44 struct xgene_enet_raw_desc16 *raw_desc;
45 struct net_device *ndev;
46 struct device *dev;
47 dma_addr_t dma_addr;
48 u32 tail = buf_pool->tail;
49 u32 slots = buf_pool->slots - 1;
50 u16 bufdatalen, len;
51 int i;
52
53 ndev = buf_pool->ndev;
54 dev = ndev_to_dev(buf_pool->ndev);
55 bufdatalen = BUF_LEN_CODE_2K | (SKB_BUFFER_SIZE & GENMASK(11, 0));
56 len = XGENE_ENET_MAX_MTU;
57
58 for (i = 0; i < nbuf; i++) {
59 raw_desc = &buf_pool->raw_desc16[tail];
60
61 skb = netdev_alloc_skb_ip_align(ndev, len);
62 if (unlikely(!skb))
63 return -ENOMEM;
64 buf_pool->rx_skb[tail] = skb;
65
66 dma_addr = dma_map_single(dev, skb->data, len, DMA_FROM_DEVICE);
67 if (dma_mapping_error(dev, dma_addr)) {
68 netdev_err(ndev, "DMA mapping error\n");
69 dev_kfree_skb_any(skb);
70 return -EINVAL;
71 }
72
73 raw_desc->m1 = cpu_to_le64(SET_VAL(DATAADDR, dma_addr) |
74 SET_VAL(BUFDATALEN, bufdatalen) |
75 SET_BIT(COHERENT));
76 tail = (tail + 1) & slots;
77 }
78
79 iowrite32(nbuf, buf_pool->cmd);
80 buf_pool->tail = tail;
81
82 return 0;
83}
84
85static u16 xgene_enet_dst_ring_num(struct xgene_enet_desc_ring *ring)
86{
87 struct xgene_enet_pdata *pdata = netdev_priv(ring->ndev);
88
89 return ((u16)pdata->rm << 10) | ring->num;
90}
91
92static u8 xgene_enet_hdr_len(const void *data)
93{
94 const struct ethhdr *eth = data;
95
96 return (eth->h_proto == htons(ETH_P_8021Q)) ? VLAN_ETH_HLEN : ETH_HLEN;
97}
98
99static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring)
100{
101 u32 __iomem *cmd_base = ring->cmd_base;
102 u32 ring_state, num_msgs;
103
104 ring_state = ioread32(&cmd_base[1]);
105 num_msgs = ring_state & CREATE_MASK(NUMMSGSINQ_POS, NUMMSGSINQ_LEN);
106
107 return num_msgs >> NUMMSGSINQ_POS;
108}
109
110static void xgene_enet_delete_bufpool(struct xgene_enet_desc_ring *buf_pool)
111{
112 struct xgene_enet_raw_desc16 *raw_desc;
113 u32 slots = buf_pool->slots - 1;
114 u32 tail = buf_pool->tail;
115 u32 userinfo;
116 int i, len;
117
118 len = xgene_enet_ring_len(buf_pool);
119 for (i = 0; i < len; i++) {
120 tail = (tail - 1) & slots;
121 raw_desc = &buf_pool->raw_desc16[tail];
122
123 /* Hardware stores descriptor in little endian format */
124 userinfo = GET_VAL(USERINFO, le64_to_cpu(raw_desc->m0));
125 dev_kfree_skb_any(buf_pool->rx_skb[userinfo]);
126 }
127
128 iowrite32(-len, buf_pool->cmd);
129 buf_pool->tail = tail;
130}
131
132static irqreturn_t xgene_enet_rx_irq(const int irq, void *data)
133{
134 struct xgene_enet_desc_ring *rx_ring = data;
135
136 if (napi_schedule_prep(&rx_ring->napi)) {
137 disable_irq_nosync(irq);
138 __napi_schedule(&rx_ring->napi);
139 }
140
141 return IRQ_HANDLED;
142}
143
144static int xgene_enet_tx_completion(struct xgene_enet_desc_ring *cp_ring,
145 struct xgene_enet_raw_desc *raw_desc)
146{
147 struct sk_buff *skb;
148 struct device *dev;
149 u16 skb_index;
150 u8 status;
151 int ret = 0;
152
153 skb_index = GET_VAL(USERINFO, le64_to_cpu(raw_desc->m0));
154 skb = cp_ring->cp_skb[skb_index];
155
156 dev = ndev_to_dev(cp_ring->ndev);
157 dma_unmap_single(dev, GET_VAL(DATAADDR, le64_to_cpu(raw_desc->m1)),
158 GET_VAL(BUFDATALEN, le64_to_cpu(raw_desc->m1)),
159 DMA_TO_DEVICE);
160
161 /* Checking for error */
162 status = GET_VAL(LERR, le64_to_cpu(raw_desc->m0));
163 if (unlikely(status > 2)) {
164 xgene_enet_parse_error(cp_ring, netdev_priv(cp_ring->ndev),
165 status);
166 ret = -EIO;
167 }
168
169 if (likely(skb)) {
170 dev_kfree_skb_any(skb);
171 } else {
172 netdev_err(cp_ring->ndev, "completion skb is NULL\n");
173 ret = -EIO;
174 }
175
176 return ret;
177}
178
179static u64 xgene_enet_work_msg(struct sk_buff *skb)
180{
181 struct iphdr *iph;
182 u8 l3hlen, l4hlen = 0;
183 u8 csum_enable = 0;
184 u8 proto = 0;
185 u8 ethhdr;
186 u64 hopinfo;
187
188 if (unlikely(skb->protocol != htons(ETH_P_IP)) &&
189 unlikely(skb->protocol != htons(ETH_P_8021Q)))
190 goto out;
191
192 if (unlikely(!(skb->dev->features & NETIF_F_IP_CSUM)))
193 goto out;
194
195 iph = ip_hdr(skb);
196 if (unlikely(ip_is_fragment(iph)))
197 goto out;
198
199 if (likely(iph->protocol == IPPROTO_TCP)) {
200 l4hlen = tcp_hdrlen(skb) >> 2;
201 csum_enable = 1;
202 proto = TSO_IPPROTO_TCP;
203 } else if (iph->protocol == IPPROTO_UDP) {
204 l4hlen = UDP_HDR_SIZE;
205 csum_enable = 1;
206 }
207out:
208 l3hlen = ip_hdrlen(skb) >> 2;
209 ethhdr = xgene_enet_hdr_len(skb->data);
210 hopinfo = SET_VAL(TCPHDR, l4hlen) |
211 SET_VAL(IPHDR, l3hlen) |
212 SET_VAL(ETHHDR, ethhdr) |
213 SET_VAL(EC, csum_enable) |
214 SET_VAL(IS, proto) |
215 SET_BIT(IC) |
216 SET_BIT(TYPE_ETH_WORK_MESSAGE);
217
218 return hopinfo;
219}
220
221static int xgene_enet_setup_tx_desc(struct xgene_enet_desc_ring *tx_ring,
222 struct sk_buff *skb)
223{
224 struct device *dev = ndev_to_dev(tx_ring->ndev);
225 struct xgene_enet_raw_desc *raw_desc;
226 dma_addr_t dma_addr;
227 u16 tail = tx_ring->tail;
228 u64 hopinfo;
229
230 raw_desc = &tx_ring->raw_desc[tail];
231 memset(raw_desc, 0, sizeof(struct xgene_enet_raw_desc));
232
233 dma_addr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE);
234 if (dma_mapping_error(dev, dma_addr)) {
235 netdev_err(tx_ring->ndev, "DMA mapping error\n");
236 return -EINVAL;
237 }
238
239 /* Hardware expects descriptor in little endian format */
240 raw_desc->m0 = cpu_to_le64(tail);
241 raw_desc->m1 = cpu_to_le64(SET_VAL(DATAADDR, dma_addr) |
242 SET_VAL(BUFDATALEN, skb->len) |
243 SET_BIT(COHERENT));
244 hopinfo = xgene_enet_work_msg(skb);
245 raw_desc->m3 = cpu_to_le64(SET_VAL(HENQNUM, tx_ring->dst_ring_num) |
246 hopinfo);
247 tx_ring->cp_ring->cp_skb[tail] = skb;
248
249 return 0;
250}
251
252static netdev_tx_t xgene_enet_start_xmit(struct sk_buff *skb,
253 struct net_device *ndev)
254{
255 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
256 struct xgene_enet_desc_ring *tx_ring = pdata->tx_ring;
257 struct xgene_enet_desc_ring *cp_ring = tx_ring->cp_ring;
258 u32 tx_level, cq_level;
259
260 tx_level = xgene_enet_ring_len(tx_ring);
261 cq_level = xgene_enet_ring_len(cp_ring);
262 if (unlikely(tx_level > pdata->tx_qcnt_hi ||
263 cq_level > pdata->cp_qcnt_hi)) {
264 netif_stop_queue(ndev);
265 return NETDEV_TX_BUSY;
266 }
267
268 if (xgene_enet_setup_tx_desc(tx_ring, skb)) {
269 dev_kfree_skb_any(skb);
270 return NETDEV_TX_OK;
271 }
272
273 iowrite32(1, tx_ring->cmd);
274 skb_tx_timestamp(skb);
275 tx_ring->tail = (tx_ring->tail + 1) & (tx_ring->slots - 1);
276
277 pdata->stats.tx_packets++;
278 pdata->stats.tx_bytes += skb->len;
279
280 return NETDEV_TX_OK;
281}
282
283static void xgene_enet_skip_csum(struct sk_buff *skb)
284{
285 struct iphdr *iph = ip_hdr(skb);
286
287 if (!ip_is_fragment(iph) ||
288 (iph->protocol != IPPROTO_TCP && iph->protocol != IPPROTO_UDP)) {
289 skb->ip_summed = CHECKSUM_UNNECESSARY;
290 }
291}
292
293static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring,
294 struct xgene_enet_raw_desc *raw_desc)
295{
296 struct net_device *ndev;
297 struct xgene_enet_pdata *pdata;
298 struct device *dev;
299 struct xgene_enet_desc_ring *buf_pool;
300 u32 datalen, skb_index;
301 struct sk_buff *skb;
302 u8 status;
303 int ret = 0;
304
305 ndev = rx_ring->ndev;
306 pdata = netdev_priv(ndev);
307 dev = ndev_to_dev(rx_ring->ndev);
308 buf_pool = rx_ring->buf_pool;
309
310 dma_unmap_single(dev, GET_VAL(DATAADDR, le64_to_cpu(raw_desc->m1)),
311 XGENE_ENET_MAX_MTU, DMA_FROM_DEVICE);
312 skb_index = GET_VAL(USERINFO, le64_to_cpu(raw_desc->m0));
313 skb = buf_pool->rx_skb[skb_index];
314
315 /* checking for error */
316 status = GET_VAL(LERR, le64_to_cpu(raw_desc->m0));
317 if (unlikely(status > 2)) {
318 dev_kfree_skb_any(skb);
319 xgene_enet_parse_error(rx_ring, netdev_priv(rx_ring->ndev),
320 status);
321 pdata->stats.rx_dropped++;
322 ret = -EIO;
323 goto out;
324 }
325
326 /* strip off CRC as HW isn't doing this */
327 datalen = GET_VAL(BUFDATALEN, le64_to_cpu(raw_desc->m1));
328 datalen -= 4;
329 prefetch(skb->data - NET_IP_ALIGN);
330 skb_put(skb, datalen);
331
332 skb_checksum_none_assert(skb);
333 skb->protocol = eth_type_trans(skb, ndev);
334 if (likely((ndev->features & NETIF_F_IP_CSUM) &&
335 skb->protocol == htons(ETH_P_IP))) {
336 xgene_enet_skip_csum(skb);
337 }
338
339 pdata->stats.rx_packets++;
340 pdata->stats.rx_bytes += datalen;
341 napi_gro_receive(&rx_ring->napi, skb);
342out:
343 if (--rx_ring->nbufpool == 0) {
344 ret = xgene_enet_refill_bufpool(buf_pool, NUM_BUFPOOL);
345 rx_ring->nbufpool = NUM_BUFPOOL;
346 }
347
348 return ret;
349}
350
351static bool is_rx_desc(struct xgene_enet_raw_desc *raw_desc)
352{
353 return GET_VAL(FPQNUM, le64_to_cpu(raw_desc->m0)) ? true : false;
354}
355
356static int xgene_enet_process_ring(struct xgene_enet_desc_ring *ring,
357 int budget)
358{
359 struct xgene_enet_pdata *pdata = netdev_priv(ring->ndev);
360 struct xgene_enet_raw_desc *raw_desc;
361 u16 head = ring->head;
362 u16 slots = ring->slots - 1;
363 int ret, count = 0;
364
365 do {
366 raw_desc = &ring->raw_desc[head];
367 if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc)))
368 break;
369
370 if (is_rx_desc(raw_desc))
371 ret = xgene_enet_rx_frame(ring, raw_desc);
372 else
373 ret = xgene_enet_tx_completion(ring, raw_desc);
374 xgene_enet_mark_desc_slot_empty(raw_desc);
375
376 head = (head + 1) & slots;
377 count++;
378
379 if (ret)
380 break;
381 } while (--budget);
382
383 if (likely(count)) {
384 iowrite32(-count, ring->cmd);
385 ring->head = head;
386
387 if (netif_queue_stopped(ring->ndev)) {
388 if (xgene_enet_ring_len(ring) < pdata->cp_qcnt_low)
389 netif_wake_queue(ring->ndev);
390 }
391 }
392
393 return budget;
394}
395
396static int xgene_enet_napi(struct napi_struct *napi, const int budget)
397{
398 struct xgene_enet_desc_ring *ring;
399 int processed;
400
401 ring = container_of(napi, struct xgene_enet_desc_ring, napi);
402 processed = xgene_enet_process_ring(ring, budget);
403
404 if (processed != budget) {
405 napi_complete(napi);
406 enable_irq(ring->irq);
407 }
408
409 return processed;
410}
411
412static void xgene_enet_timeout(struct net_device *ndev)
413{
414 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
415
416 xgene_gmac_reset(pdata);
417}
418
419static int xgene_enet_register_irq(struct net_device *ndev)
420{
421 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
422 struct device *dev = ndev_to_dev(ndev);
423 int ret;
424
425 ret = devm_request_irq(dev, pdata->rx_ring->irq, xgene_enet_rx_irq,
426 IRQF_SHARED, ndev->name, pdata->rx_ring);
427 if (ret) {
428 netdev_err(ndev, "rx%d interrupt request failed\n",
429 pdata->rx_ring->irq);
430 }
431
432 return ret;
433}
434
435static void xgene_enet_free_irq(struct net_device *ndev)
436{
437 struct xgene_enet_pdata *pdata;
438 struct device *dev;
439
440 pdata = netdev_priv(ndev);
441 dev = ndev_to_dev(ndev);
442 devm_free_irq(dev, pdata->rx_ring->irq, pdata->rx_ring);
443}
444
445static int xgene_enet_open(struct net_device *ndev)
446{
447 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
448 int ret;
449
450 xgene_gmac_tx_enable(pdata);
451 xgene_gmac_rx_enable(pdata);
452
453 ret = xgene_enet_register_irq(ndev);
454 if (ret)
455 return ret;
456 napi_enable(&pdata->rx_ring->napi);
457
458 if (pdata->phy_dev)
459 phy_start(pdata->phy_dev);
460
461 netif_start_queue(ndev);
462
463 return ret;
464}
465
466static int xgene_enet_close(struct net_device *ndev)
467{
468 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
469
470 netif_stop_queue(ndev);
471
472 if (pdata->phy_dev)
473 phy_stop(pdata->phy_dev);
474
475 napi_disable(&pdata->rx_ring->napi);
476 xgene_enet_free_irq(ndev);
477 xgene_enet_process_ring(pdata->rx_ring, -1);
478
479 xgene_gmac_tx_disable(pdata);
480 xgene_gmac_rx_disable(pdata);
481
482 return 0;
483}
484
485static void xgene_enet_delete_ring(struct xgene_enet_desc_ring *ring)
486{
487 struct xgene_enet_pdata *pdata;
488 struct device *dev;
489
490 pdata = netdev_priv(ring->ndev);
491 dev = ndev_to_dev(ring->ndev);
492
493 xgene_enet_clear_ring(ring);
494 dma_free_coherent(dev, ring->size, ring->desc_addr, ring->dma);
495}
496
497static void xgene_enet_delete_desc_rings(struct xgene_enet_pdata *pdata)
498{
499 struct xgene_enet_desc_ring *buf_pool;
500
501 if (pdata->tx_ring) {
502 xgene_enet_delete_ring(pdata->tx_ring);
503 pdata->tx_ring = NULL;
504 }
505
506 if (pdata->rx_ring) {
507 buf_pool = pdata->rx_ring->buf_pool;
508 xgene_enet_delete_bufpool(buf_pool);
509 xgene_enet_delete_ring(buf_pool);
510 xgene_enet_delete_ring(pdata->rx_ring);
511 pdata->rx_ring = NULL;
512 }
513}
514
515static int xgene_enet_get_ring_size(struct device *dev,
516 enum xgene_enet_ring_cfgsize cfgsize)
517{
518 int size = -EINVAL;
519
520 switch (cfgsize) {
521 case RING_CFGSIZE_512B:
522 size = 0x200;
523 break;
524 case RING_CFGSIZE_2KB:
525 size = 0x800;
526 break;
527 case RING_CFGSIZE_16KB:
528 size = 0x4000;
529 break;
530 case RING_CFGSIZE_64KB:
531 size = 0x10000;
532 break;
533 case RING_CFGSIZE_512KB:
534 size = 0x80000;
535 break;
536 default:
537 dev_err(dev, "Unsupported cfg ring size %d\n", cfgsize);
538 break;
539 }
540
541 return size;
542}
543
544static void xgene_enet_free_desc_ring(struct xgene_enet_desc_ring *ring)
545{
546 struct device *dev;
547
548 if (!ring)
549 return;
550
551 dev = ndev_to_dev(ring->ndev);
552
553 if (ring->desc_addr) {
554 xgene_enet_clear_ring(ring);
555 dma_free_coherent(dev, ring->size, ring->desc_addr, ring->dma);
556 }
557 devm_kfree(dev, ring);
558}
559
560static void xgene_enet_free_desc_rings(struct xgene_enet_pdata *pdata)
561{
562 struct device *dev = &pdata->pdev->dev;
563 struct xgene_enet_desc_ring *ring;
564
565 ring = pdata->tx_ring;
566 if (ring && ring->cp_ring && ring->cp_ring->cp_skb)
567 devm_kfree(dev, ring->cp_ring->cp_skb);
568 xgene_enet_free_desc_ring(ring);
569
570 ring = pdata->rx_ring;
571 if (ring && ring->buf_pool && ring->buf_pool->rx_skb)
572 devm_kfree(dev, ring->buf_pool->rx_skb);
573 xgene_enet_free_desc_ring(ring->buf_pool);
574 xgene_enet_free_desc_ring(ring);
575}
576
577static struct xgene_enet_desc_ring *xgene_enet_create_desc_ring(
578 struct net_device *ndev, u32 ring_num,
579 enum xgene_enet_ring_cfgsize cfgsize, u32 ring_id)
580{
581 struct xgene_enet_desc_ring *ring;
582 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
583 struct device *dev = ndev_to_dev(ndev);
584 u32 size;
585
586 ring = devm_kzalloc(dev, sizeof(struct xgene_enet_desc_ring),
587 GFP_KERNEL);
588 if (!ring)
589 return NULL;
590
591 ring->ndev = ndev;
592 ring->num = ring_num;
593 ring->cfgsize = cfgsize;
594 ring->id = ring_id;
595
596 size = xgene_enet_get_ring_size(dev, cfgsize);
597 ring->desc_addr = dma_zalloc_coherent(dev, size, &ring->dma,
598 GFP_KERNEL);
599 if (!ring->desc_addr) {
600 devm_kfree(dev, ring);
601 return NULL;
602 }
603 ring->size = size;
604
605 ring->cmd_base = pdata->ring_cmd_addr + (ring->num << 6);
606 ring->cmd = ring->cmd_base + INC_DEC_CMD_ADDR;
607 pdata->rm = RM3;
608 ring = xgene_enet_setup_ring(ring);
609 netdev_dbg(ndev, "ring info: num=%d size=%d id=%d slots=%d\n",
610 ring->num, ring->size, ring->id, ring->slots);
611
612 return ring;
613}
614
615static u16 xgene_enet_get_ring_id(enum xgene_ring_owner owner, u8 bufnum)
616{
617 return (owner << 6) | (bufnum & GENMASK(5, 0));
618}
619
620static int xgene_enet_create_desc_rings(struct net_device *ndev)
621{
622 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
623 struct device *dev = ndev_to_dev(ndev);
624 struct xgene_enet_desc_ring *rx_ring, *tx_ring, *cp_ring;
625 struct xgene_enet_desc_ring *buf_pool = NULL;
626 u8 cpu_bufnum = 0, eth_bufnum = 0;
627 u8 bp_bufnum = 0x20;
628 u16 ring_id, ring_num = 0;
629 int ret;
630
631 /* allocate rx descriptor ring */
632 ring_id = xgene_enet_get_ring_id(RING_OWNER_CPU, cpu_bufnum++);
633 rx_ring = xgene_enet_create_desc_ring(ndev, ring_num++,
634 RING_CFGSIZE_16KB, ring_id);
635 if (!rx_ring) {
636 ret = -ENOMEM;
637 goto err;
638 }
639
640 /* allocate buffer pool for receiving packets */
641 ring_id = xgene_enet_get_ring_id(RING_OWNER_ETH0, bp_bufnum++);
642 buf_pool = xgene_enet_create_desc_ring(ndev, ring_num++,
643 RING_CFGSIZE_2KB, ring_id);
644 if (!buf_pool) {
645 ret = -ENOMEM;
646 goto err;
647 }
648
649 rx_ring->nbufpool = NUM_BUFPOOL;
650 rx_ring->buf_pool = buf_pool;
651 rx_ring->irq = pdata->rx_irq;
652 buf_pool->rx_skb = devm_kcalloc(dev, buf_pool->slots,
653 sizeof(struct sk_buff *), GFP_KERNEL);
654 if (!buf_pool->rx_skb) {
655 ret = -ENOMEM;
656 goto err;
657 }
658
659 buf_pool->dst_ring_num = xgene_enet_dst_ring_num(buf_pool);
660 rx_ring->buf_pool = buf_pool;
661 pdata->rx_ring = rx_ring;
662
663 /* allocate tx descriptor ring */
664 ring_id = xgene_enet_get_ring_id(RING_OWNER_ETH0, eth_bufnum++);
665 tx_ring = xgene_enet_create_desc_ring(ndev, ring_num++,
666 RING_CFGSIZE_16KB, ring_id);
667 if (!tx_ring) {
668 ret = -ENOMEM;
669 goto err;
670 }
671 pdata->tx_ring = tx_ring;
672
673 cp_ring = pdata->rx_ring;
674 cp_ring->cp_skb = devm_kcalloc(dev, tx_ring->slots,
675 sizeof(struct sk_buff *), GFP_KERNEL);
676 if (!cp_ring->cp_skb) {
677 ret = -ENOMEM;
678 goto err;
679 }
680 pdata->tx_ring->cp_ring = cp_ring;
681 pdata->tx_ring->dst_ring_num = xgene_enet_dst_ring_num(cp_ring);
682
683 pdata->tx_qcnt_hi = pdata->tx_ring->slots / 2;
684 pdata->cp_qcnt_hi = pdata->rx_ring->slots / 2;
685 pdata->cp_qcnt_low = pdata->cp_qcnt_hi / 2;
686
687 return 0;
688
689err:
690 xgene_enet_free_desc_rings(pdata);
691 return ret;
692}
693
694static struct rtnl_link_stats64 *xgene_enet_get_stats64(
695 struct net_device *ndev,
696 struct rtnl_link_stats64 *storage)
697{
698 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
699 struct rtnl_link_stats64 *stats = &pdata->stats;
700
701 stats->rx_errors += stats->rx_length_errors +
702 stats->rx_crc_errors +
703 stats->rx_frame_errors +
704 stats->rx_fifo_errors;
705 memcpy(storage, &pdata->stats, sizeof(struct rtnl_link_stats64));
706
707 return storage;
708}
709
710static int xgene_enet_set_mac_address(struct net_device *ndev, void *addr)
711{
712 struct xgene_enet_pdata *pdata = netdev_priv(ndev);
713 int ret;
714
715 ret = eth_mac_addr(ndev, addr);
716 if (ret)
717 return ret;
718 xgene_gmac_set_mac_addr(pdata);
719
720 return ret;
721}
722
723static const struct net_device_ops xgene_ndev_ops = {
724 .ndo_open = xgene_enet_open,
725 .ndo_stop = xgene_enet_close,
726 .ndo_start_xmit = xgene_enet_start_xmit,
727 .ndo_tx_timeout = xgene_enet_timeout,
728 .ndo_get_stats64 = xgene_enet_get_stats64,
729 .ndo_change_mtu = eth_change_mtu,
730 .ndo_set_mac_address = xgene_enet_set_mac_address,
731};
732
733static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
734{
735 struct platform_device *pdev;
736 struct net_device *ndev;
737 struct device *dev;
738 struct resource *res;
739 void __iomem *base_addr;
740 const char *mac;
741 int ret;
742
743 pdev = pdata->pdev;
744 dev = &pdev->dev;
745 ndev = pdata->ndev;
746
747 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "enet_csr");
748 if (!res) {
749 dev_err(dev, "Resource enet_csr not defined\n");
750 return -ENODEV;
751 }
752 pdata->base_addr = devm_ioremap_resource(dev, res);
753 if (IS_ERR(pdata->base_addr)) {
754 dev_err(dev, "Unable to retrieve ENET Port CSR region\n");
755 return PTR_ERR(pdata->base_addr);
756 }
757
758 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ring_csr");
759 if (!res) {
760 dev_err(dev, "Resource ring_csr not defined\n");
761 return -ENODEV;
762 }
763 pdata->ring_csr_addr = devm_ioremap_resource(dev, res);
764 if (IS_ERR(pdata->ring_csr_addr)) {
765 dev_err(dev, "Unable to retrieve ENET Ring CSR region\n");
766 return PTR_ERR(pdata->ring_csr_addr);
767 }
768
769 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ring_cmd");
770 if (!res) {
771 dev_err(dev, "Resource ring_cmd not defined\n");
772 return -ENODEV;
773 }
774 pdata->ring_cmd_addr = devm_ioremap_resource(dev, res);
775 if (IS_ERR(pdata->ring_cmd_addr)) {
776 dev_err(dev, "Unable to retrieve ENET Ring command region\n");
777 return PTR_ERR(pdata->ring_cmd_addr);
778 }
779
780 ret = platform_get_irq(pdev, 0);
781 if (ret <= 0) {
782 dev_err(dev, "Unable to get ENET Rx IRQ\n");
783 ret = ret ? : -ENXIO;
784 return ret;
785 }
786 pdata->rx_irq = ret;
787
788 mac = of_get_mac_address(dev->of_node);
789 if (mac)
790 memcpy(ndev->dev_addr, mac, ndev->addr_len);
791 else
792 eth_hw_addr_random(ndev);
793 memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
794
795 pdata->phy_mode = of_get_phy_mode(pdev->dev.of_node);
796 if (pdata->phy_mode < 0) {
797 dev_err(dev, "Incorrect phy-connection-type in DTS\n");
798 return -EINVAL;
799 }
800
801 pdata->clk = devm_clk_get(&pdev->dev, NULL);
802 ret = IS_ERR(pdata->clk);
803 if (IS_ERR(pdata->clk)) {
804 dev_err(&pdev->dev, "can't get clock\n");
805 ret = PTR_ERR(pdata->clk);
806 return ret;
807 }
808
809 base_addr = pdata->base_addr;
810 pdata->eth_csr_addr = base_addr + BLOCK_ETH_CSR_OFFSET;
811 pdata->eth_ring_if_addr = base_addr + BLOCK_ETH_RING_IF_OFFSET;
812 pdata->eth_diag_csr_addr = base_addr + BLOCK_ETH_DIAG_CSR_OFFSET;
813 pdata->mcx_mac_addr = base_addr + BLOCK_ETH_MAC_OFFSET;
814 pdata->mcx_stats_addr = base_addr + BLOCK_ETH_STATS_OFFSET;
815 pdata->mcx_mac_csr_addr = base_addr + BLOCK_ETH_MAC_CSR_OFFSET;
816 pdata->rx_buff_cnt = NUM_PKT_BUF;
817
818 return ret;
819}
820
821static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
822{
823 struct net_device *ndev = pdata->ndev;
824 struct xgene_enet_desc_ring *buf_pool;
825 u16 dst_ring_num;
826 int ret;
827
828 xgene_gmac_tx_disable(pdata);
829 xgene_gmac_rx_disable(pdata);
830
831 ret = xgene_enet_create_desc_rings(ndev);
832 if (ret) {
833 netdev_err(ndev, "Error in ring configuration\n");
834 return ret;
835 }
836
837 /* setup buffer pool */
838 buf_pool = pdata->rx_ring->buf_pool;
839 xgene_enet_init_bufpool(buf_pool);
840 ret = xgene_enet_refill_bufpool(buf_pool, pdata->rx_buff_cnt);
841 if (ret) {
842 xgene_enet_delete_desc_rings(pdata);
843 return ret;
844 }
845
846 dst_ring_num = xgene_enet_dst_ring_num(pdata->rx_ring);
847 xgene_enet_cle_bypass(pdata, dst_ring_num, buf_pool->id);
848
849 return ret;
850}
851
852static int xgene_enet_probe(struct platform_device *pdev)
853{
854 struct net_device *ndev;
855 struct xgene_enet_pdata *pdata;
856 struct device *dev = &pdev->dev;
857 struct napi_struct *napi;
858 int ret;
859
860 ndev = alloc_etherdev(sizeof(struct xgene_enet_pdata));
861 if (!ndev)
862 return -ENOMEM;
863
864 pdata = netdev_priv(ndev);
865
866 pdata->pdev = pdev;
867 pdata->ndev = ndev;
868 SET_NETDEV_DEV(ndev, dev);
869 platform_set_drvdata(pdev, pdata);
870 ndev->netdev_ops = &xgene_ndev_ops;
871 xgene_enet_set_ethtool_ops(ndev);
872 ndev->features |= NETIF_F_IP_CSUM |
873 NETIF_F_GSO |
874 NETIF_F_GRO;
875
876 ret = xgene_enet_get_resources(pdata);
877 if (ret)
878 goto err;
879
880 xgene_enet_reset(pdata);
881 xgene_gmac_init(pdata, SPEED_1000);
882
883 ret = register_netdev(ndev);
884 if (ret) {
885 netdev_err(ndev, "Failed to register netdev\n");
886 goto err;
887 }
888
889 ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
890 if (ret) {
891 netdev_err(ndev, "No usable DMA configuration\n");
892 goto err;
893 }
894
895 ret = xgene_enet_init_hw(pdata);
896 if (ret)
897 goto err;
898
899 napi = &pdata->rx_ring->napi;
900 netif_napi_add(ndev, napi, xgene_enet_napi, NAPI_POLL_WEIGHT);
901 ret = xgene_enet_mdio_config(pdata);
902
903 return ret;
904err:
905 free_netdev(ndev);
906 return ret;
907}
908
909static int xgene_enet_remove(struct platform_device *pdev)
910{
911 struct xgene_enet_pdata *pdata;
912 struct net_device *ndev;
913
914 pdata = platform_get_drvdata(pdev);
915 ndev = pdata->ndev;
916
917 xgene_gmac_rx_disable(pdata);
918 xgene_gmac_tx_disable(pdata);
919
920 netif_napi_del(&pdata->rx_ring->napi);
921 xgene_enet_mdio_remove(pdata);
922 xgene_enet_delete_desc_rings(pdata);
923 unregister_netdev(ndev);
924 xgene_gport_shutdown(pdata);
925 free_netdev(ndev);
926
927 return 0;
928}
929
930static struct of_device_id xgene_enet_match[] = {
931 {.compatible = "apm,xgene-enet",},
932 {},
933};
934
935MODULE_DEVICE_TABLE(of, xgene_enet_match);
936
937static struct platform_driver xgene_enet_driver = {
938 .driver = {
939 .name = "xgene-enet",
940 .of_match_table = xgene_enet_match,
941 },
942 .probe = xgene_enet_probe,
943 .remove = xgene_enet_remove,
944};
945
946module_platform_driver(xgene_enet_driver);
947
948MODULE_DESCRIPTION("APM X-Gene SoC Ethernet driver");
949MODULE_VERSION(XGENE_DRV_VERSION);
950MODULE_AUTHOR("Keyur Chudgar <kchudgar@apm.com>");
951MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
new file mode 100644
index 000000000000..0815866986b0
--- /dev/null
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h
@@ -0,0 +1,135 @@
1/* Applied Micro X-Gene SoC Ethernet Driver
2 *
3 * Copyright (c) 2014, Applied Micro Circuits Corporation
4 * Authors: Iyappan Subramanian <isubramanian@apm.com>
5 * Ravi Patel <rapatel@apm.com>
6 * Keyur Chudgar <kchudgar@apm.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifndef __XGENE_ENET_MAIN_H__
23#define __XGENE_ENET_MAIN_H__
24
25#include <linux/clk.h>
26#include <linux/of_platform.h>
27#include <linux/of_net.h>
28#include <linux/of_mdio.h>
29#include <linux/module.h>
30#include <net/ip.h>
31#include <linux/prefetch.h>
32#include <linux/if_vlan.h>
33#include <linux/phy.h>
34#include "xgene_enet_hw.h"
35
36#define XGENE_DRV_VERSION "v1.0"
37#define XGENE_ENET_MAX_MTU 1536
38#define SKB_BUFFER_SIZE (XGENE_ENET_MAX_MTU - NET_IP_ALIGN)
39#define NUM_PKT_BUF 64
40#define NUM_BUFPOOL 32
41
42/* software context of a descriptor ring */
43struct xgene_enet_desc_ring {
44 struct net_device *ndev;
45 u16 id;
46 u16 num;
47 u16 head;
48 u16 tail;
49 u16 slots;
50 u16 irq;
51 u32 size;
52 u32 state[NUM_RING_CONFIG];
53 void __iomem *cmd_base;
54 void __iomem *cmd;
55 dma_addr_t dma;
56 u16 dst_ring_num;
57 u8 nbufpool;
58 struct sk_buff *(*rx_skb);
59 struct sk_buff *(*cp_skb);
60 enum xgene_enet_ring_cfgsize cfgsize;
61 struct xgene_enet_desc_ring *cp_ring;
62 struct xgene_enet_desc_ring *buf_pool;
63 struct napi_struct napi;
64 union {
65 void *desc_addr;
66 struct xgene_enet_raw_desc *raw_desc;
67 struct xgene_enet_raw_desc16 *raw_desc16;
68 };
69};
70
71/* ethernet private data */
72struct xgene_enet_pdata {
73 struct net_device *ndev;
74 struct mii_bus *mdio_bus;
75 struct phy_device *phy_dev;
76 int phy_speed;
77 struct clk *clk;
78 struct platform_device *pdev;
79 struct xgene_enet_desc_ring *tx_ring;
80 struct xgene_enet_desc_ring *rx_ring;
81 char *dev_name;
82 u32 rx_buff_cnt;
83 u32 tx_qcnt_hi;
84 u32 cp_qcnt_hi;
85 u32 cp_qcnt_low;
86 u32 rx_irq;
87 void __iomem *eth_csr_addr;
88 void __iomem *eth_ring_if_addr;
89 void __iomem *eth_diag_csr_addr;
90 void __iomem *mcx_mac_addr;
91 void __iomem *mcx_stats_addr;
92 void __iomem *mcx_mac_csr_addr;
93 void __iomem *base_addr;
94 void __iomem *ring_csr_addr;
95 void __iomem *ring_cmd_addr;
96 u32 phy_addr;
97 int phy_mode;
98 u32 speed;
99 u16 rm;
100 struct rtnl_link_stats64 stats;
101};
102
103/* Set the specified value into a bit-field defined by its starting position
104 * and length within a single u64.
105 */
106static inline u64 xgene_enet_set_field_value(int pos, int len, u64 val)
107{
108 return (val & ((1ULL << len) - 1)) << pos;
109}
110
111#define SET_VAL(field, val) \
112 xgene_enet_set_field_value(field ## _POS, field ## _LEN, val)
113
114#define SET_BIT(field) \
115 xgene_enet_set_field_value(field ## _POS, 1, 1)
116
117/* Get the value from a bit-field defined by its starting position
118 * and length within the specified u64.
119 */
120static inline u64 xgene_enet_get_field_value(int pos, int len, u64 src)
121{
122 return (src >> pos) & ((1ULL << len) - 1);
123}
124
125#define GET_VAL(field, src) \
126 xgene_enet_get_field_value(field ## _POS, field ## _LEN, src)
127
128static inline struct device *ndev_to_dev(struct net_device *ndev)
129{
130 return ndev->dev.parent;
131}
132
133void xgene_enet_set_ethtool_ops(struct net_device *netdev);
134
135#endif /* __XGENE_ENET_MAIN_H__ */
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index ce455aed5a2f..3f9d4de8173c 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -739,7 +739,6 @@ static void bcmgenet_power_down(struct bcmgenet_priv *priv,
739 739
740 case GENET_POWER_PASSIVE: 740 case GENET_POWER_PASSIVE:
741 /* Power down LED */ 741 /* Power down LED */
742 bcmgenet_mii_reset(priv->dev);
743 if (priv->hw_params->flags & GENET_HAS_EXT) { 742 if (priv->hw_params->flags & GENET_HAS_EXT) {
744 reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); 743 reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
745 reg |= (EXT_PWR_DOWN_PHY | 744 reg |= (EXT_PWR_DOWN_PHY |
@@ -779,7 +778,9 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,
779 } 778 }
780 779
781 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); 780 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
782 bcmgenet_mii_reset(priv->dev); 781
782 if (mode == GENET_POWER_PASSIVE)
783 bcmgenet_mii_reset(priv->dev);
783} 784}
784 785
785/* ioctl handle special commands that are not present in ethtool. */ 786/* ioctl handle special commands that are not present in ethtool. */
@@ -1961,7 +1962,8 @@ static void bcmgenet_set_hw_addr(struct bcmgenet_priv *priv,
1961static int bcmgenet_wol_resume(struct bcmgenet_priv *priv) 1962static int bcmgenet_wol_resume(struct bcmgenet_priv *priv)
1962{ 1963{
1963 /* From WOL-enabled suspend, switch to regular clock */ 1964 /* From WOL-enabled suspend, switch to regular clock */
1964 clk_disable_unprepare(priv->clk_wol); 1965 if (priv->wolopts)
1966 clk_disable_unprepare(priv->clk_wol);
1965 1967
1966 phy_init_hw(priv->phydev); 1968 phy_init_hw(priv->phydev);
1967 /* Speed settings must be restored */ 1969 /* Speed settings must be restored */
@@ -2164,6 +2166,10 @@ static void bcmgenet_netif_stop(struct net_device *dev)
2164 * disabled no new work will be scheduled. 2166 * disabled no new work will be scheduled.
2165 */ 2167 */
2166 cancel_work_sync(&priv->bcmgenet_irq_work); 2168 cancel_work_sync(&priv->bcmgenet_irq_work);
2169
2170 priv->old_pause = -1;
2171 priv->old_link = -1;
2172 priv->old_duplex = -1;
2167} 2173}
2168 2174
2169static int bcmgenet_close(struct net_device *dev) 2175static int bcmgenet_close(struct net_device *dev)
@@ -2533,6 +2539,13 @@ static int bcmgenet_probe(struct platform_device *pdev)
2533 priv->pdev = pdev; 2539 priv->pdev = pdev;
2534 priv->version = (enum bcmgenet_version)of_id->data; 2540 priv->version = (enum bcmgenet_version)of_id->data;
2535 2541
2542 priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
2543 if (IS_ERR(priv->clk))
2544 dev_warn(&priv->pdev->dev, "failed to get enet clock\n");
2545
2546 if (!IS_ERR(priv->clk))
2547 clk_prepare_enable(priv->clk);
2548
2536 bcmgenet_set_hw_params(priv); 2549 bcmgenet_set_hw_params(priv);
2537 2550
2538 /* Mii wait queue */ 2551 /* Mii wait queue */
@@ -2541,17 +2554,10 @@ static int bcmgenet_probe(struct platform_device *pdev)
2541 priv->rx_buf_len = RX_BUF_LENGTH; 2554 priv->rx_buf_len = RX_BUF_LENGTH;
2542 INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task); 2555 INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task);
2543 2556
2544 priv->clk = devm_clk_get(&priv->pdev->dev, "enet");
2545 if (IS_ERR(priv->clk))
2546 dev_warn(&priv->pdev->dev, "failed to get enet clock\n");
2547
2548 priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol"); 2557 priv->clk_wol = devm_clk_get(&priv->pdev->dev, "enet-wol");
2549 if (IS_ERR(priv->clk_wol)) 2558 if (IS_ERR(priv->clk_wol))
2550 dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n"); 2559 dev_warn(&priv->pdev->dev, "failed to get enet-wol clock\n");
2551 2560
2552 if (!IS_ERR(priv->clk))
2553 clk_prepare_enable(priv->clk);
2554
2555 err = reset_umac(priv); 2561 err = reset_umac(priv);
2556 if (err) 2562 if (err)
2557 goto err_clk_disable; 2563 goto err_clk_disable;
@@ -2611,6 +2617,8 @@ static int bcmgenet_suspend(struct device *d)
2611 2617
2612 bcmgenet_netif_stop(dev); 2618 bcmgenet_netif_stop(dev);
2613 2619
2620 phy_suspend(priv->phydev);
2621
2614 netif_device_detach(dev); 2622 netif_device_detach(dev);
2615 2623
2616 /* Disable MAC receive */ 2624 /* Disable MAC receive */
@@ -2661,9 +2669,7 @@ static int bcmgenet_resume(struct device *d)
2661 if (ret) 2669 if (ret)
2662 goto out_clk_disable; 2670 goto out_clk_disable;
2663 2671
2664 if (priv->wolopts) 2672 ret = bcmgenet_wol_resume(priv);
2665 ret = bcmgenet_wol_resume(priv);
2666
2667 if (ret) 2673 if (ret)
2668 goto out_clk_disable; 2674 goto out_clk_disable;
2669 2675
@@ -2678,6 +2684,9 @@ static int bcmgenet_resume(struct device *d)
2678 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); 2684 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
2679 } 2685 }
2680 2686
2687 if (priv->wolopts)
2688 bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
2689
2681 /* Disable RX/TX DMA and flush TX queues */ 2690 /* Disable RX/TX DMA and flush TX queues */
2682 dma_ctrl = bcmgenet_dma_disable(priv); 2691 dma_ctrl = bcmgenet_dma_disable(priv);
2683 2692
@@ -2693,6 +2702,8 @@ static int bcmgenet_resume(struct device *d)
2693 2702
2694 netif_device_attach(dev); 2703 netif_device_attach(dev);
2695 2704
2705 phy_resume(priv->phydev);
2706
2696 bcmgenet_netif_start(dev); 2707 bcmgenet_netif_start(dev);
2697 2708
2698 return 0; 2709 return 0;
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 18961613d385..c88f7ae99636 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -129,7 +129,10 @@ static void bcmgenet_mii_setup(struct net_device *dev)
129 cmd_bits |= CMD_RX_PAUSE_IGNORE | CMD_TX_PAUSE_IGNORE; 129 cmd_bits |= CMD_RX_PAUSE_IGNORE | CMD_TX_PAUSE_IGNORE;
130 } 130 }
131 131
132 if (status_changed) { 132 if (!status_changed)
133 return;
134
135 if (phydev->link) {
133 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 136 reg = bcmgenet_umac_readl(priv, UMAC_CMD);
134 reg &= ~((CMD_SPEED_MASK << CMD_SPEED_SHIFT) | 137 reg &= ~((CMD_SPEED_MASK << CMD_SPEED_SHIFT) |
135 CMD_HD_EN | 138 CMD_HD_EN |
@@ -137,8 +140,9 @@ static void bcmgenet_mii_setup(struct net_device *dev)
137 reg |= cmd_bits; 140 reg |= cmd_bits;
138 bcmgenet_umac_writel(priv, reg, UMAC_CMD); 141 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
139 142
140 phy_print_status(phydev);
141 } 143 }
144
145 phy_print_status(phydev);
142} 146}
143 147
144void bcmgenet_mii_reset(struct net_device *dev) 148void bcmgenet_mii_reset(struct net_device *dev)
@@ -303,12 +307,12 @@ static int bcmgenet_mii_probe(struct net_device *dev)
303 /* In the case of a fixed PHY, the DT node associated 307 /* In the case of a fixed PHY, the DT node associated
304 * to the PHY is the Ethernet MAC DT node. 308 * to the PHY is the Ethernet MAC DT node.
305 */ 309 */
306 if (of_phy_is_fixed_link(dn)) { 310 if (!priv->phy_dn && of_phy_is_fixed_link(dn)) {
307 ret = of_phy_register_fixed_link(dn); 311 ret = of_phy_register_fixed_link(dn);
308 if (ret) 312 if (ret)
309 return ret; 313 return ret;
310 314
311 priv->phy_dn = dn; 315 priv->phy_dn = of_node_get(dn);
312 } 316 }
313 317
314 phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup, 0, 318 phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup, 0,
@@ -444,6 +448,7 @@ int bcmgenet_mii_init(struct net_device *dev)
444 return 0; 448 return 0;
445 449
446out: 450out:
451 of_node_put(priv->phy_dn);
447 mdiobus_unregister(priv->mii_bus); 452 mdiobus_unregister(priv->mii_bus);
448out_free: 453out_free:
449 kfree(priv->mii_bus->irq); 454 kfree(priv->mii_bus->irq);
@@ -455,6 +460,7 @@ void bcmgenet_mii_exit(struct net_device *dev)
455{ 460{
456 struct bcmgenet_priv *priv = netdev_priv(dev); 461 struct bcmgenet_priv *priv = netdev_priv(dev);
457 462
463 of_node_put(priv->phy_dn);
458 mdiobus_unregister(priv->mii_bus); 464 mdiobus_unregister(priv->mii_bus);
459 kfree(priv->mii_bus->irq); 465 kfree(priv->mii_bus->irq);
460 mdiobus_free(priv->mii_bus); 466 mdiobus_free(priv->mii_bus);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index c9b922cc3e67..d57282172ea5 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -50,13 +50,13 @@
50#include "cxgb4_uld.h" 50#include "cxgb4_uld.h"
51 51
52#define T4FW_VERSION_MAJOR 0x01 52#define T4FW_VERSION_MAJOR 0x01
53#define T4FW_VERSION_MINOR 0x09 53#define T4FW_VERSION_MINOR 0x0B
54#define T4FW_VERSION_MICRO 0x17 54#define T4FW_VERSION_MICRO 0x1B
55#define T4FW_VERSION_BUILD 0x00 55#define T4FW_VERSION_BUILD 0x00
56 56
57#define T5FW_VERSION_MAJOR 0x01 57#define T5FW_VERSION_MAJOR 0x01
58#define T5FW_VERSION_MINOR 0x09 58#define T5FW_VERSION_MINOR 0x0B
59#define T5FW_VERSION_MICRO 0x17 59#define T5FW_VERSION_MICRO 0x1B
60#define T5FW_VERSION_BUILD 0x00 60#define T5FW_VERSION_BUILD 0x00
61 61
62#define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__) 62#define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__)
@@ -522,6 +522,9 @@ struct sge_txq {
522struct sge_eth_txq { /* state for an SGE Ethernet Tx queue */ 522struct sge_eth_txq { /* state for an SGE Ethernet Tx queue */
523 struct sge_txq q; 523 struct sge_txq q;
524 struct netdev_queue *txq; /* associated netdev TX queue */ 524 struct netdev_queue *txq; /* associated netdev TX queue */
525#ifdef CONFIG_CHELSIO_T4_DCB
526 u8 dcb_prio; /* DCB Priority bound to queue */
527#endif
525 unsigned long tso; /* # of TSO requests */ 528 unsigned long tso; /* # of TSO requests */
526 unsigned long tx_cso; /* # of Tx checksum offloads */ 529 unsigned long tx_cso; /* # of Tx checksum offloads */
527 unsigned long vlan_ins; /* # of Tx VLAN insertions */ 530 unsigned long vlan_ins; /* # of Tx VLAN insertions */
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c
index 0d3a9df5be36..8edf0f5bd679 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c
@@ -20,6 +20,17 @@
20 20
21#include "cxgb4.h" 21#include "cxgb4.h"
22 22
23/* DCBx version control
24 */
25char *dcb_ver_array[] = {
26 "Unknown",
27 "DCBx-CIN",
28 "DCBx-CEE 1.01",
29 "DCBx-IEEE",
30 "", "", "",
31 "Auto Negotiated"
32};
33
23/* Initialize a port's Data Center Bridging state. Typically used after a 34/* Initialize a port's Data Center Bridging state. Typically used after a
24 * Link Down event. 35 * Link Down event.
25 */ 36 */
@@ -27,25 +38,45 @@ void cxgb4_dcb_state_init(struct net_device *dev)
27{ 38{
28 struct port_info *pi = netdev2pinfo(dev); 39 struct port_info *pi = netdev2pinfo(dev);
29 struct port_dcb_info *dcb = &pi->dcb; 40 struct port_dcb_info *dcb = &pi->dcb;
41 int version_temp = dcb->dcb_version;
30 42
31 memset(dcb, 0, sizeof(struct port_dcb_info)); 43 memset(dcb, 0, sizeof(struct port_dcb_info));
32 dcb->state = CXGB4_DCB_STATE_START; 44 dcb->state = CXGB4_DCB_STATE_START;
45 if (version_temp)
46 dcb->dcb_version = version_temp;
47
48 netdev_dbg(dev, "%s: Initializing DCB state for port[%d]\n",
49 __func__, pi->port_id);
50}
51
52void cxgb4_dcb_version_init(struct net_device *dev)
53{
54 struct port_info *pi = netdev2pinfo(dev);
55 struct port_dcb_info *dcb = &pi->dcb;
56
57 /* Any writes here are only done on kernels that exlicitly need
58 * a specific version, say < 2.6.38 which only support CEE
59 */
60 dcb->dcb_version = FW_PORT_DCB_VER_AUTO;
33} 61}
34 62
35/* Finite State machine for Data Center Bridging. 63/* Finite State machine for Data Center Bridging.
36 */ 64 */
37void cxgb4_dcb_state_fsm(struct net_device *dev, 65void cxgb4_dcb_state_fsm(struct net_device *dev,
38 enum cxgb4_dcb_state_input input) 66 enum cxgb4_dcb_state_input transition_to)
39{ 67{
40 struct port_info *pi = netdev2pinfo(dev); 68 struct port_info *pi = netdev2pinfo(dev);
41 struct port_dcb_info *dcb = &pi->dcb; 69 struct port_dcb_info *dcb = &pi->dcb;
42 struct adapter *adap = pi->adapter; 70 struct adapter *adap = pi->adapter;
71 enum cxgb4_dcb_state current_state = dcb->state;
43 72
44 switch (input) { 73 netdev_dbg(dev, "%s: State change from %d to %d for %s\n",
45 case CXGB4_DCB_INPUT_FW_DISABLED: { 74 __func__, dcb->state, transition_to, dev->name);
46 /* Firmware tells us it's not doing DCB */ 75
47 switch (dcb->state) { 76 switch (current_state) {
48 case CXGB4_DCB_STATE_START: { 77 case CXGB4_DCB_STATE_START: {
78 switch (transition_to) {
79 case CXGB4_DCB_INPUT_FW_DISABLED: {
49 /* we're going to use Host DCB */ 80 /* we're going to use Host DCB */
50 dcb->state = CXGB4_DCB_STATE_HOST; 81 dcb->state = CXGB4_DCB_STATE_HOST;
51 dcb->supported = CXGB4_DCBX_HOST_SUPPORT; 82 dcb->supported = CXGB4_DCBX_HOST_SUPPORT;
@@ -53,48 +84,62 @@ void cxgb4_dcb_state_fsm(struct net_device *dev,
53 break; 84 break;
54 } 85 }
55 86
56 case CXGB4_DCB_STATE_HOST: { 87 case CXGB4_DCB_INPUT_FW_ENABLED: {
57 /* we're alreaady in Host DCB mode */ 88 /* we're going to use Firmware DCB */
89 dcb->state = CXGB4_DCB_STATE_FW_INCOMPLETE;
90 dcb->supported = CXGB4_DCBX_FW_SUPPORT;
91 break;
92 }
93
94 case CXGB4_DCB_INPUT_FW_INCOMPLETE: {
95 /* expected transition */
96 break;
97 }
98
99 case CXGB4_DCB_INPUT_FW_ALLSYNCED: {
100 dcb->state = CXGB4_DCB_STATE_FW_ALLSYNCED;
58 break; 101 break;
59 } 102 }
60 103
61 default: 104 default:
62 goto bad_state_transition; 105 goto bad_state_input;
63 } 106 }
64 break; 107 break;
65 } 108 }
66 109
67 case CXGB4_DCB_INPUT_FW_ENABLED: { 110 case CXGB4_DCB_STATE_FW_INCOMPLETE: {
68 /* Firmware tells us that it is doing DCB */ 111 switch (transition_to) {
69 switch (dcb->state) { 112 case CXGB4_DCB_INPUT_FW_ENABLED: {
70 case CXGB4_DCB_STATE_START: { 113 /* we're alreaady in firmware DCB mode */
71 /* we're going to use Firmware DCB */
72 dcb->state = CXGB4_DCB_STATE_FW_INCOMPLETE;
73 dcb->supported = CXGB4_DCBX_FW_SUPPORT;
74 break; 114 break;
75 } 115 }
76 116
77 case CXGB4_DCB_STATE_FW_INCOMPLETE: 117 case CXGB4_DCB_INPUT_FW_INCOMPLETE: {
78 case CXGB4_DCB_STATE_FW_ALLSYNCED: { 118 /* we're already incomplete */
79 /* we're alreaady in firmware DCB mode */ 119 break;
120 }
121
122 case CXGB4_DCB_INPUT_FW_ALLSYNCED: {
123 dcb->state = CXGB4_DCB_STATE_FW_ALLSYNCED;
124 dcb->enabled = 1;
125 linkwatch_fire_event(dev);
80 break; 126 break;
81 } 127 }
82 128
83 default: 129 default:
84 goto bad_state_transition; 130 goto bad_state_input;
85 } 131 }
86 break; 132 break;
87 } 133 }
88 134
89 case CXGB4_DCB_INPUT_FW_INCOMPLETE: { 135 case CXGB4_DCB_STATE_FW_ALLSYNCED: {
90 /* Firmware tells us that its DCB state is incomplete */ 136 switch (transition_to) {
91 switch (dcb->state) { 137 case CXGB4_DCB_INPUT_FW_ENABLED: {
92 case CXGB4_DCB_STATE_FW_INCOMPLETE: { 138 /* we're alreaady in firmware DCB mode */
93 /* we're already incomplete */
94 break; 139 break;
95 } 140 }
96 141
97 case CXGB4_DCB_STATE_FW_ALLSYNCED: { 142 case CXGB4_DCB_INPUT_FW_INCOMPLETE: {
98 /* We were successfully running with firmware DCB but 143 /* We were successfully running with firmware DCB but
99 * now it's telling us that it's in an "incomplete 144 * now it's telling us that it's in an "incomplete
100 * state. We need to reset back to a ground state 145 * state. We need to reset back to a ground state
@@ -107,46 +152,48 @@ void cxgb4_dcb_state_fsm(struct net_device *dev,
107 break; 152 break;
108 } 153 }
109 154
110 default: 155 case CXGB4_DCB_INPUT_FW_ALLSYNCED: {
111 goto bad_state_transition; 156 /* we're already all sync'ed
112 } 157 * this is only applicable for IEEE or
113 break; 158 * when another VI already completed negotiaton
114 } 159 */
115
116 case CXGB4_DCB_INPUT_FW_ALLSYNCED: {
117 /* Firmware tells us that its DCB state is complete */
118 switch (dcb->state) {
119 case CXGB4_DCB_STATE_FW_INCOMPLETE: {
120 dcb->state = CXGB4_DCB_STATE_FW_ALLSYNCED;
121 dcb->enabled = 1; 160 dcb->enabled = 1;
122 linkwatch_fire_event(dev); 161 linkwatch_fire_event(dev);
123 break; 162 break;
124 } 163 }
125 164
126 case CXGB4_DCB_STATE_FW_ALLSYNCED: { 165 default:
127 /* we're already all sync'ed */ 166 goto bad_state_input;
167 }
168 break;
169 }
170
171 case CXGB4_DCB_STATE_HOST: {
172 switch (transition_to) {
173 case CXGB4_DCB_INPUT_FW_DISABLED: {
174 /* we're alreaady in Host DCB mode */
128 break; 175 break;
129 } 176 }
130 177
131 default: 178 default:
132 goto bad_state_transition; 179 goto bad_state_input;
133 } 180 }
134 break; 181 break;
135 } 182 }
136 183
137 default: 184 default:
138 goto bad_state_input; 185 goto bad_state_transition;
139 } 186 }
140 return; 187 return;
141 188
142bad_state_input: 189bad_state_input:
143 dev_err(adap->pdev_dev, "cxgb4_dcb_state_fsm: illegal input symbol %d\n", 190 dev_err(adap->pdev_dev, "cxgb4_dcb_state_fsm: illegal input symbol %d\n",
144 input); 191 transition_to);
145 return; 192 return;
146 193
147bad_state_transition: 194bad_state_transition:
148 dev_err(adap->pdev_dev, "cxgb4_dcb_state_fsm: bad state transition, state = %d, input = %d\n", 195 dev_err(adap->pdev_dev, "cxgb4_dcb_state_fsm: bad state transition, state = %d, input = %d\n",
149 dcb->state, input); 196 current_state, transition_to);
150} 197}
151 198
152/* Handle a DCB/DCBX update message from the firmware. 199/* Handle a DCB/DCBX update message from the firmware.
@@ -160,6 +207,7 @@ void cxgb4_dcb_handle_fw_update(struct adapter *adap,
160 struct port_info *pi = netdev_priv(dev); 207 struct port_info *pi = netdev_priv(dev);
161 struct port_dcb_info *dcb = &pi->dcb; 208 struct port_dcb_info *dcb = &pi->dcb;
162 int dcb_type = pcmd->u.dcb.pgid.type; 209 int dcb_type = pcmd->u.dcb.pgid.type;
210 int dcb_running_version;
163 211
164 /* Handle Firmware DCB Control messages separately since they drive 212 /* Handle Firmware DCB Control messages separately since they drive
165 * our state machine. 213 * our state machine.
@@ -171,6 +219,25 @@ void cxgb4_dcb_handle_fw_update(struct adapter *adap,
171 ? CXGB4_DCB_STATE_FW_ALLSYNCED 219 ? CXGB4_DCB_STATE_FW_ALLSYNCED
172 : CXGB4_DCB_STATE_FW_INCOMPLETE); 220 : CXGB4_DCB_STATE_FW_INCOMPLETE);
173 221
222 if (dcb->dcb_version != FW_PORT_DCB_VER_UNKNOWN) {
223 dcb_running_version = FW_PORT_CMD_DCB_VERSION_GET(
224 be16_to_cpu(
225 pcmd->u.dcb.control.dcb_version_to_app_state));
226 if (dcb_running_version == FW_PORT_DCB_VER_CEE1D01 ||
227 dcb_running_version == FW_PORT_DCB_VER_IEEE) {
228 dcb->dcb_version = dcb_running_version;
229 dev_warn(adap->pdev_dev, "Interface %s is running %s\n",
230 dev->name,
231 dcb_ver_array[dcb->dcb_version]);
232 } else {
233 dev_warn(adap->pdev_dev,
234 "Something screwed up, requested firmware for %s, but firmware returned %s instead\n",
235 dcb_ver_array[dcb->dcb_version],
236 dcb_ver_array[dcb_running_version]);
237 dcb->dcb_version = FW_PORT_DCB_VER_UNKNOWN;
238 }
239 }
240
174 cxgb4_dcb_state_fsm(dev, input); 241 cxgb4_dcb_state_fsm(dev, input);
175 return; 242 return;
176 } 243 }
@@ -199,7 +266,11 @@ void cxgb4_dcb_handle_fw_update(struct adapter *adap,
199 dcb->pg_num_tcs_supported = fwdcb->pgrate.num_tcs_supported; 266 dcb->pg_num_tcs_supported = fwdcb->pgrate.num_tcs_supported;
200 memcpy(dcb->pgrate, &fwdcb->pgrate.pgrate, 267 memcpy(dcb->pgrate, &fwdcb->pgrate.pgrate,
201 sizeof(dcb->pgrate)); 268 sizeof(dcb->pgrate));
269 memcpy(dcb->tsa, &fwdcb->pgrate.tsa,
270 sizeof(dcb->tsa));
202 dcb->msgs |= CXGB4_DCB_FW_PGRATE; 271 dcb->msgs |= CXGB4_DCB_FW_PGRATE;
272 if (dcb->msgs & CXGB4_DCB_FW_PGID)
273 IEEE_FAUX_SYNC(dev, dcb);
203 break; 274 break;
204 275
205 case FW_PORT_DCB_TYPE_PRIORATE: 276 case FW_PORT_DCB_TYPE_PRIORATE:
@@ -212,6 +283,7 @@ void cxgb4_dcb_handle_fw_update(struct adapter *adap,
212 dcb->pfcen = fwdcb->pfc.pfcen; 283 dcb->pfcen = fwdcb->pfc.pfcen;
213 dcb->pfc_num_tcs_supported = fwdcb->pfc.max_pfc_tcs; 284 dcb->pfc_num_tcs_supported = fwdcb->pfc.max_pfc_tcs;
214 dcb->msgs |= CXGB4_DCB_FW_PFC; 285 dcb->msgs |= CXGB4_DCB_FW_PFC;
286 IEEE_FAUX_SYNC(dev, dcb);
215 break; 287 break;
216 288
217 case FW_PORT_DCB_TYPE_APP_ID: { 289 case FW_PORT_DCB_TYPE_APP_ID: {
@@ -220,13 +292,25 @@ void cxgb4_dcb_handle_fw_update(struct adapter *adap,
220 struct app_priority *ap = &dcb->app_priority[idx]; 292 struct app_priority *ap = &dcb->app_priority[idx];
221 293
222 struct dcb_app app = { 294 struct dcb_app app = {
223 .selector = fwap->sel_field,
224 .protocol = be16_to_cpu(fwap->protocolid), 295 .protocol = be16_to_cpu(fwap->protocolid),
225 .priority = fwap->user_prio_map,
226 }; 296 };
227 int err; 297 int err;
228 298
229 err = dcb_setapp(dev, &app); 299 /* Convert from firmware format to relevant format
300 * when using app selector
301 */
302 if (dcb->dcb_version == FW_PORT_DCB_VER_IEEE) {
303 app.selector = (fwap->sel_field + 1);
304 app.priority = ffs(fwap->user_prio_map) - 1;
305 err = dcb_ieee_setapp(dev, &app);
306 IEEE_FAUX_SYNC(dev, dcb);
307 } else {
308 /* Default is CEE */
309 app.selector = !!(fwap->sel_field);
310 app.priority = fwap->user_prio_map;
311 err = dcb_setapp(dev, &app);
312 }
313
230 if (err) 314 if (err)
231 dev_err(adap->pdev_dev, 315 dev_err(adap->pdev_dev,
232 "Failed DCB Set Application Priority: sel=%d, prot=%d, prio=%d, err=%d\n", 316 "Failed DCB Set Application Priority: sel=%d, prot=%d, prio=%d, err=%d\n",
@@ -408,9 +492,10 @@ static void cxgb4_getpgbwgcfg(struct net_device *dev, int pgid, u8 *bw_per,
408 if (err != FW_PORT_DCB_CFG_SUCCESS) { 492 if (err != FW_PORT_DCB_CFG_SUCCESS) {
409 dev_err(adap->pdev_dev, "DCB read PGRATE failed with %d\n", 493 dev_err(adap->pdev_dev, "DCB read PGRATE failed with %d\n",
410 -err); 494 -err);
411 } else { 495 return;
412 *bw_per = pcmd.u.dcb.pgrate.pgrate[pgid];
413 } 496 }
497
498 *bw_per = pcmd.u.dcb.pgrate.pgrate[pgid];
414} 499}
415 500
416static void cxgb4_getpgbwgcfg_tx(struct net_device *dev, int pgid, u8 *bw_per) 501static void cxgb4_getpgbwgcfg_tx(struct net_device *dev, int pgid, u8 *bw_per)
@@ -637,7 +722,8 @@ static int __cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id,
637 return err; 722 return err;
638 } 723 }
639 if (be16_to_cpu(pcmd.u.dcb.app_priority.protocolid) == app_id) 724 if (be16_to_cpu(pcmd.u.dcb.app_priority.protocolid) == app_id)
640 return pcmd.u.dcb.app_priority.user_prio_map; 725 if (pcmd.u.dcb.app_priority.sel_field == app_idtype)
726 return pcmd.u.dcb.app_priority.user_prio_map;
641 727
642 /* exhausted app list */ 728 /* exhausted app list */
643 if (!pcmd.u.dcb.app_priority.protocolid) 729 if (!pcmd.u.dcb.app_priority.protocolid)
@@ -657,8 +743,8 @@ static int cxgb4_getapp(struct net_device *dev, u8 app_idtype, u16 app_id)
657 743
658/* Write a new Application User Priority Map for the specified Application ID 744/* Write a new Application User Priority Map for the specified Application ID
659 */ 745 */
660static int cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id, 746static int __cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id,
661 u8 app_prio) 747 u8 app_prio)
662{ 748{
663 struct fw_port_cmd pcmd; 749 struct fw_port_cmd pcmd;
664 struct port_info *pi = netdev2pinfo(dev); 750 struct port_info *pi = netdev2pinfo(dev);
@@ -673,10 +759,6 @@ static int cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id,
673 if (!netif_carrier_ok(dev)) 759 if (!netif_carrier_ok(dev))
674 return -ENOLINK; 760 return -ENOLINK;
675 761
676 if (app_idtype != DCB_APP_IDTYPE_ETHTYPE &&
677 app_idtype != DCB_APP_IDTYPE_PORTNUM)
678 return -EINVAL;
679
680 for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) { 762 for (i = 0; i < CXGB4_MAX_DCBX_APP_SUPPORTED; i++) {
681 INIT_PORT_DCB_READ_LOCAL_CMD(pcmd, pi->port_id); 763 INIT_PORT_DCB_READ_LOCAL_CMD(pcmd, pi->port_id);
682 pcmd.u.dcb.app_priority.type = FW_PORT_DCB_TYPE_APP_ID; 764 pcmd.u.dcb.app_priority.type = FW_PORT_DCB_TYPE_APP_ID;
@@ -725,6 +807,30 @@ static int cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id,
725 return 0; 807 return 0;
726} 808}
727 809
810/* Priority for CEE inside dcb_app is bitmask, with 0 being an invalid value */
811static int cxgb4_setapp(struct net_device *dev, u8 app_idtype, u16 app_id,
812 u8 app_prio)
813{
814 int ret;
815 struct dcb_app app = {
816 .selector = app_idtype,
817 .protocol = app_id,
818 .priority = app_prio,
819 };
820
821 if (app_idtype != DCB_APP_IDTYPE_ETHTYPE &&
822 app_idtype != DCB_APP_IDTYPE_PORTNUM)
823 return -EINVAL;
824
825 /* Convert app_idtype to a format that firmware understands */
826 ret = __cxgb4_setapp(dev, app_idtype == DCB_APP_IDTYPE_ETHTYPE ?
827 app_idtype : 3, app_id, app_prio);
828 if (ret)
829 return ret;
830
831 return dcb_setapp(dev, &app);
832}
833
728/* Return whether IEEE Data Center Bridging has been negotiated. 834/* Return whether IEEE Data Center Bridging has been negotiated.
729 */ 835 */
730static inline int cxgb4_ieee_negotiation_complete(struct net_device *dev) 836static inline int cxgb4_ieee_negotiation_complete(struct net_device *dev)
@@ -738,6 +844,7 @@ static inline int cxgb4_ieee_negotiation_complete(struct net_device *dev)
738 844
739/* Fill in the Application User Priority Map associated with the 845/* Fill in the Application User Priority Map associated with the
740 * specified Application. 846 * specified Application.
847 * Priority for IEEE dcb_app is an integer, with 0 being a valid value
741 */ 848 */
742static int cxgb4_ieee_getapp(struct net_device *dev, struct dcb_app *app) 849static int cxgb4_ieee_getapp(struct net_device *dev, struct dcb_app *app)
743{ 850{
@@ -748,28 +855,39 @@ static int cxgb4_ieee_getapp(struct net_device *dev, struct dcb_app *app)
748 if (!(app->selector && app->protocol)) 855 if (!(app->selector && app->protocol))
749 return -EINVAL; 856 return -EINVAL;
750 857
751 prio = dcb_getapp(dev, app); 858 /* Try querying firmware first, use firmware format */
752 if (prio == 0) { 859 prio = __cxgb4_getapp(dev, app->selector - 1, app->protocol, 0);
753 /* If app doesn't exist in dcb_app table, try firmware 860
754 * directly. 861 if (prio < 0)
755 */ 862 prio = dcb_ieee_getapp_mask(dev, app);
756 prio = __cxgb4_getapp(dev, app->selector, app->protocol, 0);
757 }
758 863
759 app->priority = prio; 864 app->priority = ffs(prio) - 1;
760 return 0; 865 return 0;
761} 866}
762 867
763/* Write a new Application User Priority Map for the specified App id. */ 868/* Write a new Application User Priority Map for the specified Application ID.
869 * Priority for IEEE dcb_app is an integer, with 0 being a valid value
870 */
764static int cxgb4_ieee_setapp(struct net_device *dev, struct dcb_app *app) 871static int cxgb4_ieee_setapp(struct net_device *dev, struct dcb_app *app)
765{ 872{
873 int ret;
874
766 if (!cxgb4_ieee_negotiation_complete(dev)) 875 if (!cxgb4_ieee_negotiation_complete(dev))
767 return -EINVAL; 876 return -EINVAL;
768 if (!(app->selector && app->protocol && app->priority)) 877 if (!(app->selector && app->protocol))
878 return -EINVAL;
879
880 if (!(app->selector > IEEE_8021QAZ_APP_SEL_ETHERTYPE &&
881 app->selector < IEEE_8021QAZ_APP_SEL_ANY))
769 return -EINVAL; 882 return -EINVAL;
770 883
771 cxgb4_setapp(dev, app->selector, app->protocol, app->priority); 884 /* change selector to a format that firmware understands */
772 return dcb_setapp(dev, app); 885 ret = __cxgb4_setapp(dev, app->selector - 1, app->protocol,
886 (1 << app->priority));
887 if (ret)
888 return ret;
889
890 return dcb_ieee_setapp(dev, app);
773} 891}
774 892
775/* Return our DCBX parameters. 893/* Return our DCBX parameters.
@@ -794,8 +912,9 @@ static u8 cxgb4_setdcbx(struct net_device *dev, u8 dcb_request)
794 != dcb_request) 912 != dcb_request)
795 return 1; 913 return 1;
796 914
797 /* Can't set DCBX capabilities if DCBX isn't enabled. */ 915 /* Can't enable DCB if we haven't successfully negotiated it.
798 if (!pi->dcb.state) 916 */
917 if (pi->dcb.state != CXGB4_DCB_STATE_FW_ALLSYNCED)
799 return 1; 918 return 1;
800 919
801 /* There's currently no mechanism to allow for the firmware DCBX 920 /* There's currently no mechanism to allow for the firmware DCBX
@@ -874,7 +993,8 @@ static int cxgb4_getpeerapp_tbl(struct net_device *dev, struct dcb_app *table)
874 table[i].selector = pcmd.u.dcb.app_priority.sel_field; 993 table[i].selector = pcmd.u.dcb.app_priority.sel_field;
875 table[i].protocol = 994 table[i].protocol =
876 be16_to_cpu(pcmd.u.dcb.app_priority.protocolid); 995 be16_to_cpu(pcmd.u.dcb.app_priority.protocolid);
877 table[i].priority = pcmd.u.dcb.app_priority.user_prio_map; 996 table[i].priority =
997 ffs(pcmd.u.dcb.app_priority.user_prio_map) - 1;
878 } 998 }
879 return err; 999 return err;
880} 1000}
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.h
index 1ec1d834e257..2a6aa88984f4 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.h
@@ -63,6 +63,13 @@
63#define INIT_PORT_DCB_WRITE_CMD(__pcmd, __port) \ 63#define INIT_PORT_DCB_WRITE_CMD(__pcmd, __port) \
64 INIT_PORT_DCB_CMD(__pcmd, __port, EXEC, FW_PORT_ACTION_L2_DCB_CFG) 64 INIT_PORT_DCB_CMD(__pcmd, __port, EXEC, FW_PORT_ACTION_L2_DCB_CFG)
65 65
66#define IEEE_FAUX_SYNC(__dev, __dcb) \
67 do { \
68 if ((__dcb)->dcb_version == FW_PORT_DCB_VER_IEEE) \
69 cxgb4_dcb_state_fsm((__dev), \
70 CXGB4_DCB_STATE_FW_ALLSYNCED); \
71 } while (0)
72
66/* States we can be in for a port's Data Center Bridging. 73/* States we can be in for a port's Data Center Bridging.
67 */ 74 */
68enum cxgb4_dcb_state { 75enum cxgb4_dcb_state {
@@ -108,11 +115,13 @@ struct port_dcb_info {
108 * Native Endian format). 115 * Native Endian format).
109 */ 116 */
110 u32 pgid; /* Priority Group[0..7] */ 117 u32 pgid; /* Priority Group[0..7] */
118 u8 dcb_version; /* Running DCBx version */
111 u8 pfcen; /* Priority Flow Control[0..7] */ 119 u8 pfcen; /* Priority Flow Control[0..7] */
112 u8 pg_num_tcs_supported; /* max PG Traffic Classes */ 120 u8 pg_num_tcs_supported; /* max PG Traffic Classes */
113 u8 pfc_num_tcs_supported; /* max PFC Traffic Classes */ 121 u8 pfc_num_tcs_supported; /* max PFC Traffic Classes */
114 u8 pgrate[8]; /* Priority Group Rate[0..7] */ 122 u8 pgrate[8]; /* Priority Group Rate[0..7] */
115 u8 priorate[8]; /* Priority Rate[0..7] */ 123 u8 priorate[8]; /* Priority Rate[0..7] */
124 u8 tsa[8]; /* TSA Algorithm[0..7] */
116 struct app_priority { /* Application Information */ 125 struct app_priority { /* Application Information */
117 u8 user_prio_map; /* Priority Map bitfield */ 126 u8 user_prio_map; /* Priority Map bitfield */
118 u8 sel_field; /* Protocol ID interpretation */ 127 u8 sel_field; /* Protocol ID interpretation */
@@ -121,6 +130,7 @@ struct port_dcb_info {
121}; 130};
122 131
123void cxgb4_dcb_state_init(struct net_device *); 132void cxgb4_dcb_state_init(struct net_device *);
133void cxgb4_dcb_version_init(struct net_device *);
124void cxgb4_dcb_state_fsm(struct net_device *, enum cxgb4_dcb_state_input); 134void cxgb4_dcb_state_fsm(struct net_device *, enum cxgb4_dcb_state_input);
125void cxgb4_dcb_handle_fw_update(struct adapter *, const struct fw_port_cmd *); 135void cxgb4_dcb_handle_fw_update(struct adapter *, const struct fw_port_cmd *);
126void cxgb4_dcb_set_caps(struct adapter *, const struct fw_port_cmd *); 136void cxgb4_dcb_set_caps(struct adapter *, const struct fw_port_cmd *);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 1a162d21d8ac..a62d3f468c52 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -522,6 +522,8 @@ static void dcb_tx_queue_prio_enable(struct net_device *dev, int enable)
522 dev_err(adap->pdev_dev, 522 dev_err(adap->pdev_dev,
523 "Can't %s DCB Priority on port %d, TX Queue %d: err=%d\n", 523 "Can't %s DCB Priority on port %d, TX Queue %d: err=%d\n",
524 enable ? "set" : "unset", pi->port_id, i, -err); 524 enable ? "set" : "unset", pi->port_id, i, -err);
525 else
526 txq->dcb_prio = value;
525 } 527 }
526} 528}
527#endif /* CONFIG_CHELSIO_T4_DCB */ 529#endif /* CONFIG_CHELSIO_T4_DCB */
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
index ff709e3b3e7e..0549170d7e2e 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
@@ -1629,6 +1629,14 @@ enum fw_port_l2cfg_ctlbf {
1629 FW_PORT_L2_CTLBF_TXIPG = 0x20 1629 FW_PORT_L2_CTLBF_TXIPG = 0x20
1630}; 1630};
1631 1631
1632enum fw_port_dcb_versions {
1633 FW_PORT_DCB_VER_UNKNOWN,
1634 FW_PORT_DCB_VER_CEE1D0,
1635 FW_PORT_DCB_VER_CEE1D01,
1636 FW_PORT_DCB_VER_IEEE,
1637 FW_PORT_DCB_VER_AUTO = 7
1638};
1639
1632enum fw_port_dcb_cfg { 1640enum fw_port_dcb_cfg {
1633 FW_PORT_DCB_CFG_PG = 0x01, 1641 FW_PORT_DCB_CFG_PG = 0x01,
1634 FW_PORT_DCB_CFG_PFC = 0x02, 1642 FW_PORT_DCB_CFG_PFC = 0x02,
@@ -1709,6 +1717,7 @@ struct fw_port_cmd {
1709 __u8 r10_lo[5]; 1717 __u8 r10_lo[5];
1710 __u8 num_tcs_supported; 1718 __u8 num_tcs_supported;
1711 __u8 pgrate[8]; 1719 __u8 pgrate[8];
1720 __u8 tsa[8];
1712 } pgrate; 1721 } pgrate;
1713 struct fw_port_dcb_priorate { 1722 struct fw_port_dcb_priorate {
1714 __u8 type; 1723 __u8 type;
@@ -1735,7 +1744,7 @@ struct fw_port_cmd {
1735 struct fw_port_dcb_control { 1744 struct fw_port_dcb_control {
1736 __u8 type; 1745 __u8 type;
1737 __u8 all_syncd_pkd; 1746 __u8 all_syncd_pkd;
1738 __be16 pfc_state_to_app_state; 1747 __be16 dcb_version_to_app_state;
1739 __be32 r11; 1748 __be32 r11;
1740 __be64 r12; 1749 __be64 r12;
1741 } control; 1750 } control;
@@ -1778,6 +1787,7 @@ struct fw_port_cmd {
1778#define FW_PORT_CMD_DCBXDIS (1U << 7) 1787#define FW_PORT_CMD_DCBXDIS (1U << 7)
1779#define FW_PORT_CMD_APPLY (1U << 7) 1788#define FW_PORT_CMD_APPLY (1U << 7)
1780#define FW_PORT_CMD_ALL_SYNCD (1U << 7) 1789#define FW_PORT_CMD_ALL_SYNCD (1U << 7)
1790#define FW_PORT_CMD_DCB_VERSION_GET(x) (((x) >> 8) & 0xf)
1781 1791
1782#define FW_PORT_CMD_PPPEN(x) ((x) << 31) 1792#define FW_PORT_CMD_PPPEN(x) ((x) << 31)
1783#define FW_PORT_CMD_TPSRC(x) ((x) << 28) 1793#define FW_PORT_CMD_TPSRC(x) ((x) << 28)
diff --git a/drivers/net/ethernet/davicom/dm9000.c b/drivers/net/ethernet/davicom/dm9000.c
index 23084fb2090e..9b33057a9477 100644
--- a/drivers/net/ethernet/davicom/dm9000.c
+++ b/drivers/net/ethernet/davicom/dm9000.c
@@ -93,7 +93,7 @@ enum dm9000_type {
93}; 93};
94 94
95/* Structure/enum declaration ------------------------------- */ 95/* Structure/enum declaration ------------------------------- */
96typedef struct board_info { 96struct board_info {
97 97
98 void __iomem *io_addr; /* Register I/O base address */ 98 void __iomem *io_addr; /* Register I/O base address */
99 void __iomem *io_data; /* Data I/O address */ 99 void __iomem *io_data; /* Data I/O address */
@@ -141,7 +141,7 @@ typedef struct board_info {
141 u32 wake_state; 141 u32 wake_state;
142 142
143 int ip_summed; 143 int ip_summed;
144} board_info_t; 144};
145 145
146/* debug code */ 146/* debug code */
147 147
@@ -151,7 +151,7 @@ typedef struct board_info {
151 } \ 151 } \
152} while (0) 152} while (0)
153 153
154static inline board_info_t *to_dm9000_board(struct net_device *dev) 154static inline struct board_info *to_dm9000_board(struct net_device *dev)
155{ 155{
156 return netdev_priv(dev); 156 return netdev_priv(dev);
157} 157}
@@ -162,7 +162,7 @@ static inline board_info_t *to_dm9000_board(struct net_device *dev)
162 * Read a byte from I/O port 162 * Read a byte from I/O port
163 */ 163 */
164static u8 164static u8
165ior(board_info_t *db, int reg) 165ior(struct board_info *db, int reg)
166{ 166{
167 writeb(reg, db->io_addr); 167 writeb(reg, db->io_addr);
168 return readb(db->io_data); 168 return readb(db->io_data);
@@ -173,14 +173,14 @@ ior(board_info_t *db, int reg)
173 */ 173 */
174 174
175static void 175static void
176iow(board_info_t *db, int reg, int value) 176iow(struct board_info *db, int reg, int value)
177{ 177{
178 writeb(reg, db->io_addr); 178 writeb(reg, db->io_addr);
179 writeb(value, db->io_data); 179 writeb(value, db->io_data);
180} 180}
181 181
182static void 182static void
183dm9000_reset(board_info_t *db) 183dm9000_reset(struct board_info *db)
184{ 184{
185 dev_dbg(db->dev, "resetting device\n"); 185 dev_dbg(db->dev, "resetting device\n");
186 186
@@ -272,7 +272,7 @@ static void dm9000_dumpblk_32bit(void __iomem *reg, int count)
272 * Sleep, either by using msleep() or if we are suspending, then 272 * Sleep, either by using msleep() or if we are suspending, then
273 * use mdelay() to sleep. 273 * use mdelay() to sleep.
274 */ 274 */
275static void dm9000_msleep(board_info_t *db, unsigned int ms) 275static void dm9000_msleep(struct board_info *db, unsigned int ms)
276{ 276{
277 if (db->in_suspend || db->in_timeout) 277 if (db->in_suspend || db->in_timeout)
278 mdelay(ms); 278 mdelay(ms);
@@ -284,7 +284,7 @@ static void dm9000_msleep(board_info_t *db, unsigned int ms)
284static int 284static int
285dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) 285dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg)
286{ 286{
287 board_info_t *db = netdev_priv(dev); 287 struct board_info *db = netdev_priv(dev);
288 unsigned long flags; 288 unsigned long flags;
289 unsigned int reg_save; 289 unsigned int reg_save;
290 int ret; 290 int ret;
@@ -330,7 +330,7 @@ static void
330dm9000_phy_write(struct net_device *dev, 330dm9000_phy_write(struct net_device *dev,
331 int phyaddr_unused, int reg, int value) 331 int phyaddr_unused, int reg, int value)
332{ 332{
333 board_info_t *db = netdev_priv(dev); 333 struct board_info *db = netdev_priv(dev);
334 unsigned long flags; 334 unsigned long flags;
335 unsigned long reg_save; 335 unsigned long reg_save;
336 336
@@ -408,7 +408,7 @@ static void dm9000_set_io(struct board_info *db, int byte_width)
408 } 408 }
409} 409}
410 410
411static void dm9000_schedule_poll(board_info_t *db) 411static void dm9000_schedule_poll(struct board_info *db)
412{ 412{
413 if (db->type == TYPE_DM9000E) 413 if (db->type == TYPE_DM9000E)
414 schedule_delayed_work(&db->phy_poll, HZ * 2); 414 schedule_delayed_work(&db->phy_poll, HZ * 2);
@@ -416,7 +416,7 @@ static void dm9000_schedule_poll(board_info_t *db)
416 416
417static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd) 417static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
418{ 418{
419 board_info_t *dm = to_dm9000_board(dev); 419 struct board_info *dm = to_dm9000_board(dev);
420 420
421 if (!netif_running(dev)) 421 if (!netif_running(dev))
422 return -EINVAL; 422 return -EINVAL;
@@ -425,7 +425,7 @@ static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
425} 425}
426 426
427static unsigned int 427static unsigned int
428dm9000_read_locked(board_info_t *db, int reg) 428dm9000_read_locked(struct board_info *db, int reg)
429{ 429{
430 unsigned long flags; 430 unsigned long flags;
431 unsigned int ret; 431 unsigned int ret;
@@ -437,7 +437,7 @@ dm9000_read_locked(board_info_t *db, int reg)
437 return ret; 437 return ret;
438} 438}
439 439
440static int dm9000_wait_eeprom(board_info_t *db) 440static int dm9000_wait_eeprom(struct board_info *db)
441{ 441{
442 unsigned int status; 442 unsigned int status;
443 int timeout = 8; /* wait max 8msec */ 443 int timeout = 8; /* wait max 8msec */
@@ -474,7 +474,7 @@ static int dm9000_wait_eeprom(board_info_t *db)
474 * Read a word data from EEPROM 474 * Read a word data from EEPROM
475 */ 475 */
476static void 476static void
477dm9000_read_eeprom(board_info_t *db, int offset, u8 *to) 477dm9000_read_eeprom(struct board_info *db, int offset, u8 *to)
478{ 478{
479 unsigned long flags; 479 unsigned long flags;
480 480
@@ -514,7 +514,7 @@ dm9000_read_eeprom(board_info_t *db, int offset, u8 *to)
514 * Write a word data to SROM 514 * Write a word data to SROM
515 */ 515 */
516static void 516static void
517dm9000_write_eeprom(board_info_t *db, int offset, u8 *data) 517dm9000_write_eeprom(struct board_info *db, int offset, u8 *data)
518{ 518{
519 unsigned long flags; 519 unsigned long flags;
520 520
@@ -546,7 +546,7 @@ dm9000_write_eeprom(board_info_t *db, int offset, u8 *data)
546static void dm9000_get_drvinfo(struct net_device *dev, 546static void dm9000_get_drvinfo(struct net_device *dev,
547 struct ethtool_drvinfo *info) 547 struct ethtool_drvinfo *info)
548{ 548{
549 board_info_t *dm = to_dm9000_board(dev); 549 struct board_info *dm = to_dm9000_board(dev);
550 550
551 strlcpy(info->driver, CARDNAME, sizeof(info->driver)); 551 strlcpy(info->driver, CARDNAME, sizeof(info->driver));
552 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); 552 strlcpy(info->version, DRV_VERSION, sizeof(info->version));
@@ -556,21 +556,21 @@ static void dm9000_get_drvinfo(struct net_device *dev,
556 556
557static u32 dm9000_get_msglevel(struct net_device *dev) 557static u32 dm9000_get_msglevel(struct net_device *dev)
558{ 558{
559 board_info_t *dm = to_dm9000_board(dev); 559 struct board_info *dm = to_dm9000_board(dev);
560 560
561 return dm->msg_enable; 561 return dm->msg_enable;
562} 562}
563 563
564static void dm9000_set_msglevel(struct net_device *dev, u32 value) 564static void dm9000_set_msglevel(struct net_device *dev, u32 value)
565{ 565{
566 board_info_t *dm = to_dm9000_board(dev); 566 struct board_info *dm = to_dm9000_board(dev);
567 567
568 dm->msg_enable = value; 568 dm->msg_enable = value;
569} 569}
570 570
571static int dm9000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 571static int dm9000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
572{ 572{
573 board_info_t *dm = to_dm9000_board(dev); 573 struct board_info *dm = to_dm9000_board(dev);
574 574
575 mii_ethtool_gset(&dm->mii, cmd); 575 mii_ethtool_gset(&dm->mii, cmd);
576 return 0; 576 return 0;
@@ -578,21 +578,21 @@ static int dm9000_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
578 578
579static int dm9000_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 579static int dm9000_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
580{ 580{
581 board_info_t *dm = to_dm9000_board(dev); 581 struct board_info *dm = to_dm9000_board(dev);
582 582
583 return mii_ethtool_sset(&dm->mii, cmd); 583 return mii_ethtool_sset(&dm->mii, cmd);
584} 584}
585 585
586static int dm9000_nway_reset(struct net_device *dev) 586static int dm9000_nway_reset(struct net_device *dev)
587{ 587{
588 board_info_t *dm = to_dm9000_board(dev); 588 struct board_info *dm = to_dm9000_board(dev);
589 return mii_nway_restart(&dm->mii); 589 return mii_nway_restart(&dm->mii);
590} 590}
591 591
592static int dm9000_set_features(struct net_device *dev, 592static int dm9000_set_features(struct net_device *dev,
593 netdev_features_t features) 593 netdev_features_t features)
594{ 594{
595 board_info_t *dm = to_dm9000_board(dev); 595 struct board_info *dm = to_dm9000_board(dev);
596 netdev_features_t changed = dev->features ^ features; 596 netdev_features_t changed = dev->features ^ features;
597 unsigned long flags; 597 unsigned long flags;
598 598
@@ -608,7 +608,7 @@ static int dm9000_set_features(struct net_device *dev,
608 608
609static u32 dm9000_get_link(struct net_device *dev) 609static u32 dm9000_get_link(struct net_device *dev)
610{ 610{
611 board_info_t *dm = to_dm9000_board(dev); 611 struct board_info *dm = to_dm9000_board(dev);
612 u32 ret; 612 u32 ret;
613 613
614 if (dm->flags & DM9000_PLATF_EXT_PHY) 614 if (dm->flags & DM9000_PLATF_EXT_PHY)
@@ -629,7 +629,7 @@ static int dm9000_get_eeprom_len(struct net_device *dev)
629static int dm9000_get_eeprom(struct net_device *dev, 629static int dm9000_get_eeprom(struct net_device *dev,
630 struct ethtool_eeprom *ee, u8 *data) 630 struct ethtool_eeprom *ee, u8 *data)
631{ 631{
632 board_info_t *dm = to_dm9000_board(dev); 632 struct board_info *dm = to_dm9000_board(dev);
633 int offset = ee->offset; 633 int offset = ee->offset;
634 int len = ee->len; 634 int len = ee->len;
635 int i; 635 int i;
@@ -653,7 +653,7 @@ static int dm9000_get_eeprom(struct net_device *dev,
653static int dm9000_set_eeprom(struct net_device *dev, 653static int dm9000_set_eeprom(struct net_device *dev,
654 struct ethtool_eeprom *ee, u8 *data) 654 struct ethtool_eeprom *ee, u8 *data)
655{ 655{
656 board_info_t *dm = to_dm9000_board(dev); 656 struct board_info *dm = to_dm9000_board(dev);
657 int offset = ee->offset; 657 int offset = ee->offset;
658 int len = ee->len; 658 int len = ee->len;
659 int done; 659 int done;
@@ -691,7 +691,7 @@ static int dm9000_set_eeprom(struct net_device *dev,
691 691
692static void dm9000_get_wol(struct net_device *dev, struct ethtool_wolinfo *w) 692static void dm9000_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
693{ 693{
694 board_info_t *dm = to_dm9000_board(dev); 694 struct board_info *dm = to_dm9000_board(dev);
695 695
696 memset(w, 0, sizeof(struct ethtool_wolinfo)); 696 memset(w, 0, sizeof(struct ethtool_wolinfo));
697 697
@@ -702,7 +702,7 @@ static void dm9000_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
702 702
703static int dm9000_set_wol(struct net_device *dev, struct ethtool_wolinfo *w) 703static int dm9000_set_wol(struct net_device *dev, struct ethtool_wolinfo *w)
704{ 704{
705 board_info_t *dm = to_dm9000_board(dev); 705 struct board_info *dm = to_dm9000_board(dev);
706 unsigned long flags; 706 unsigned long flags;
707 u32 opts = w->wolopts; 707 u32 opts = w->wolopts;
708 u32 wcr = 0; 708 u32 wcr = 0;
@@ -752,7 +752,7 @@ static const struct ethtool_ops dm9000_ethtool_ops = {
752 .set_eeprom = dm9000_set_eeprom, 752 .set_eeprom = dm9000_set_eeprom,
753}; 753};
754 754
755static void dm9000_show_carrier(board_info_t *db, 755static void dm9000_show_carrier(struct board_info *db,
756 unsigned carrier, unsigned nsr) 756 unsigned carrier, unsigned nsr)
757{ 757{
758 int lpa; 758 int lpa;
@@ -775,7 +775,7 @@ static void
775dm9000_poll_work(struct work_struct *w) 775dm9000_poll_work(struct work_struct *w)
776{ 776{
777 struct delayed_work *dw = to_delayed_work(w); 777 struct delayed_work *dw = to_delayed_work(w);
778 board_info_t *db = container_of(dw, board_info_t, phy_poll); 778 struct board_info *db = container_of(dw, struct board_info, phy_poll);
779 struct net_device *ndev = db->ndev; 779 struct net_device *ndev = db->ndev;
780 780
781 if (db->flags & DM9000_PLATF_SIMPLE_PHY && 781 if (db->flags & DM9000_PLATF_SIMPLE_PHY &&
@@ -843,7 +843,7 @@ static unsigned char dm9000_type_to_char(enum dm9000_type type)
843static void 843static void
844dm9000_hash_table_unlocked(struct net_device *dev) 844dm9000_hash_table_unlocked(struct net_device *dev)
845{ 845{
846 board_info_t *db = netdev_priv(dev); 846 struct board_info *db = netdev_priv(dev);
847 struct netdev_hw_addr *ha; 847 struct netdev_hw_addr *ha;
848 int i, oft; 848 int i, oft;
849 u32 hash_val; 849 u32 hash_val;
@@ -879,7 +879,7 @@ dm9000_hash_table_unlocked(struct net_device *dev)
879static void 879static void
880dm9000_hash_table(struct net_device *dev) 880dm9000_hash_table(struct net_device *dev)
881{ 881{
882 board_info_t *db = netdev_priv(dev); 882 struct board_info *db = netdev_priv(dev);
883 unsigned long flags; 883 unsigned long flags;
884 884
885 spin_lock_irqsave(&db->lock, flags); 885 spin_lock_irqsave(&db->lock, flags);
@@ -888,13 +888,13 @@ dm9000_hash_table(struct net_device *dev)
888} 888}
889 889
890static void 890static void
891dm9000_mask_interrupts(board_info_t *db) 891dm9000_mask_interrupts(struct board_info *db)
892{ 892{
893 iow(db, DM9000_IMR, IMR_PAR); 893 iow(db, DM9000_IMR, IMR_PAR);
894} 894}
895 895
896static void 896static void
897dm9000_unmask_interrupts(board_info_t *db) 897dm9000_unmask_interrupts(struct board_info *db)
898{ 898{
899 iow(db, DM9000_IMR, db->imr_all); 899 iow(db, DM9000_IMR, db->imr_all);
900} 900}
@@ -905,7 +905,7 @@ dm9000_unmask_interrupts(board_info_t *db)
905static void 905static void
906dm9000_init_dm9000(struct net_device *dev) 906dm9000_init_dm9000(struct net_device *dev)
907{ 907{
908 board_info_t *db = netdev_priv(dev); 908 struct board_info *db = netdev_priv(dev);
909 unsigned int imr; 909 unsigned int imr;
910 unsigned int ncr; 910 unsigned int ncr;
911 911
@@ -970,7 +970,7 @@ dm9000_init_dm9000(struct net_device *dev)
970/* Our watchdog timed out. Called by the networking layer */ 970/* Our watchdog timed out. Called by the networking layer */
971static void dm9000_timeout(struct net_device *dev) 971static void dm9000_timeout(struct net_device *dev)
972{ 972{
973 board_info_t *db = netdev_priv(dev); 973 struct board_info *db = netdev_priv(dev);
974 u8 reg_save; 974 u8 reg_save;
975 unsigned long flags; 975 unsigned long flags;
976 976
@@ -996,7 +996,7 @@ static void dm9000_send_packet(struct net_device *dev,
996 int ip_summed, 996 int ip_summed,
997 u16 pkt_len) 997 u16 pkt_len)
998{ 998{
999 board_info_t *dm = to_dm9000_board(dev); 999 struct board_info *dm = to_dm9000_board(dev);
1000 1000
1001 /* The DM9000 is not smart enough to leave fragmented packets alone. */ 1001 /* The DM9000 is not smart enough to leave fragmented packets alone. */
1002 if (dm->ip_summed != ip_summed) { 1002 if (dm->ip_summed != ip_summed) {
@@ -1023,7 +1023,7 @@ static int
1023dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev) 1023dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
1024{ 1024{
1025 unsigned long flags; 1025 unsigned long flags;
1026 board_info_t *db = netdev_priv(dev); 1026 struct board_info *db = netdev_priv(dev);
1027 1027
1028 dm9000_dbg(db, 3, "%s:\n", __func__); 1028 dm9000_dbg(db, 3, "%s:\n", __func__);
1029 1029
@@ -1062,7 +1062,7 @@ dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
1062 * receive the packet to upper layer, free the transmitted packet 1062 * receive the packet to upper layer, free the transmitted packet
1063 */ 1063 */
1064 1064
1065static void dm9000_tx_done(struct net_device *dev, board_info_t *db) 1065static void dm9000_tx_done(struct net_device *dev, struct board_info *db)
1066{ 1066{
1067 int tx_status = ior(db, DM9000_NSR); /* Got TX status */ 1067 int tx_status = ior(db, DM9000_NSR); /* Got TX status */
1068 1068
@@ -1094,7 +1094,7 @@ struct dm9000_rxhdr {
1094static void 1094static void
1095dm9000_rx(struct net_device *dev) 1095dm9000_rx(struct net_device *dev)
1096{ 1096{
1097 board_info_t *db = netdev_priv(dev); 1097 struct board_info *db = netdev_priv(dev);
1098 struct dm9000_rxhdr rxhdr; 1098 struct dm9000_rxhdr rxhdr;
1099 struct sk_buff *skb; 1099 struct sk_buff *skb;
1100 u8 rxbyte, *rdptr; 1100 u8 rxbyte, *rdptr;
@@ -1196,7 +1196,7 @@ dm9000_rx(struct net_device *dev)
1196static irqreturn_t dm9000_interrupt(int irq, void *dev_id) 1196static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
1197{ 1197{
1198 struct net_device *dev = dev_id; 1198 struct net_device *dev = dev_id;
1199 board_info_t *db = netdev_priv(dev); 1199 struct board_info *db = netdev_priv(dev);
1200 int int_status; 1200 int int_status;
1201 unsigned long flags; 1201 unsigned long flags;
1202 u8 reg_save; 1202 u8 reg_save;
@@ -1246,7 +1246,7 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
1246static irqreturn_t dm9000_wol_interrupt(int irq, void *dev_id) 1246static irqreturn_t dm9000_wol_interrupt(int irq, void *dev_id)
1247{ 1247{
1248 struct net_device *dev = dev_id; 1248 struct net_device *dev = dev_id;
1249 board_info_t *db = netdev_priv(dev); 1249 struct board_info *db = netdev_priv(dev);
1250 unsigned long flags; 1250 unsigned long flags;
1251 unsigned nsr, wcr; 1251 unsigned nsr, wcr;
1252 1252
@@ -1296,7 +1296,7 @@ static void dm9000_poll_controller(struct net_device *dev)
1296static int 1296static int
1297dm9000_open(struct net_device *dev) 1297dm9000_open(struct net_device *dev)
1298{ 1298{
1299 board_info_t *db = netdev_priv(dev); 1299 struct board_info *db = netdev_priv(dev);
1300 unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK; 1300 unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;
1301 1301
1302 if (netif_msg_ifup(db)) 1302 if (netif_msg_ifup(db))
@@ -1342,7 +1342,7 @@ dm9000_open(struct net_device *dev)
1342static void 1342static void
1343dm9000_shutdown(struct net_device *dev) 1343dm9000_shutdown(struct net_device *dev)
1344{ 1344{
1345 board_info_t *db = netdev_priv(dev); 1345 struct board_info *db = netdev_priv(dev);
1346 1346
1347 /* RESET device */ 1347 /* RESET device */
1348 dm9000_phy_write(dev, 0, MII_BMCR, BMCR_RESET); /* PHY RESET */ 1348 dm9000_phy_write(dev, 0, MII_BMCR, BMCR_RESET); /* PHY RESET */
@@ -1358,7 +1358,7 @@ dm9000_shutdown(struct net_device *dev)
1358static int 1358static int
1359dm9000_stop(struct net_device *ndev) 1359dm9000_stop(struct net_device *ndev)
1360{ 1360{
1361 board_info_t *db = netdev_priv(ndev); 1361 struct board_info *db = netdev_priv(ndev);
1362 1362
1363 if (netif_msg_ifdown(db)) 1363 if (netif_msg_ifdown(db))
1364 dev_dbg(db->dev, "shutting down %s\n", ndev->name); 1364 dev_dbg(db->dev, "shutting down %s\n", ndev->name);
@@ -1681,7 +1681,7 @@ dm9000_drv_suspend(struct device *dev)
1681{ 1681{
1682 struct platform_device *pdev = to_platform_device(dev); 1682 struct platform_device *pdev = to_platform_device(dev);
1683 struct net_device *ndev = platform_get_drvdata(pdev); 1683 struct net_device *ndev = platform_get_drvdata(pdev);
1684 board_info_t *db; 1684 struct board_info *db;
1685 1685
1686 if (ndev) { 1686 if (ndev) {
1687 db = netdev_priv(ndev); 1687 db = netdev_priv(ndev);
@@ -1704,7 +1704,7 @@ dm9000_drv_resume(struct device *dev)
1704{ 1704{
1705 struct platform_device *pdev = to_platform_device(dev); 1705 struct platform_device *pdev = to_platform_device(dev);
1706 struct net_device *ndev = platform_get_drvdata(pdev); 1706 struct net_device *ndev = platform_get_drvdata(pdev);
1707 board_info_t *db = netdev_priv(ndev); 1707 struct board_info *db = netdev_priv(ndev);
1708 1708
1709 if (ndev) { 1709 if (ndev) {
1710 if (netif_running(ndev)) { 1710 if (netif_running(ndev)) {
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index bd53caf1c1eb..9f7fa644a397 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -310,6 +310,7 @@ struct fec_enet_private {
310 int mii_timeout; 310 int mii_timeout;
311 uint phy_speed; 311 uint phy_speed;
312 phy_interface_t phy_interface; 312 phy_interface_t phy_interface;
313 struct device_node *phy_node;
313 int link; 314 int link;
314 int full_duplex; 315 int full_duplex;
315 int speed; 316 int speed;
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 66fe1f672499..4f87dffcb9b2 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -52,6 +52,7 @@
52#include <linux/of.h> 52#include <linux/of.h>
53#include <linux/of_device.h> 53#include <linux/of_device.h>
54#include <linux/of_gpio.h> 54#include <linux/of_gpio.h>
55#include <linux/of_mdio.h>
55#include <linux/of_net.h> 56#include <linux/of_net.h>
56#include <linux/regulator/consumer.h> 57#include <linux/regulator/consumer.h>
57#include <linux/if_vlan.h> 58#include <linux/if_vlan.h>
@@ -1648,29 +1649,37 @@ static int fec_enet_mii_probe(struct net_device *ndev)
1648 1649
1649 fep->phy_dev = NULL; 1650 fep->phy_dev = NULL;
1650 1651
1651 /* check for attached phy */ 1652 if (fep->phy_node) {
1652 for (phy_id = 0; (phy_id < PHY_MAX_ADDR); phy_id++) { 1653 phy_dev = of_phy_connect(ndev, fep->phy_node,
1653 if ((fep->mii_bus->phy_mask & (1 << phy_id))) 1654 &fec_enet_adjust_link, 0,
1654 continue; 1655 fep->phy_interface);
1655 if (fep->mii_bus->phy_map[phy_id] == NULL) 1656 } else {
1656 continue; 1657 /* check for attached phy */
1657 if (fep->mii_bus->phy_map[phy_id]->phy_id == 0) 1658 for (phy_id = 0; (phy_id < PHY_MAX_ADDR); phy_id++) {
1658 continue; 1659 if ((fep->mii_bus->phy_mask & (1 << phy_id)))
1659 if (dev_id--) 1660 continue;
1660 continue; 1661 if (fep->mii_bus->phy_map[phy_id] == NULL)
1661 strncpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE); 1662 continue;
1662 break; 1663 if (fep->mii_bus->phy_map[phy_id]->phy_id == 0)
1663 } 1664 continue;
1665 if (dev_id--)
1666 continue;
1667 strncpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE);
1668 break;
1669 }
1664 1670
1665 if (phy_id >= PHY_MAX_ADDR) { 1671 if (phy_id >= PHY_MAX_ADDR) {
1666 netdev_info(ndev, "no PHY, assuming direct connection to switch\n"); 1672 netdev_info(ndev, "no PHY, assuming direct connection to switch\n");
1667 strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); 1673 strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE);
1668 phy_id = 0; 1674 phy_id = 0;
1675 }
1676
1677 snprintf(phy_name, sizeof(phy_name),
1678 PHY_ID_FMT, mdio_bus_id, phy_id);
1679 phy_dev = phy_connect(ndev, phy_name, &fec_enet_adjust_link,
1680 fep->phy_interface);
1669 } 1681 }
1670 1682
1671 snprintf(phy_name, sizeof(phy_name), PHY_ID_FMT, mdio_bus_id, phy_id);
1672 phy_dev = phy_connect(ndev, phy_name, &fec_enet_adjust_link,
1673 fep->phy_interface);
1674 if (IS_ERR(phy_dev)) { 1683 if (IS_ERR(phy_dev)) {
1675 netdev_err(ndev, "could not attach to PHY\n"); 1684 netdev_err(ndev, "could not attach to PHY\n");
1676 return PTR_ERR(phy_dev); 1685 return PTR_ERR(phy_dev);
@@ -1707,6 +1716,7 @@ static int fec_enet_mii_init(struct platform_device *pdev)
1707 struct fec_enet_private *fep = netdev_priv(ndev); 1716 struct fec_enet_private *fep = netdev_priv(ndev);
1708 const struct platform_device_id *id_entry = 1717 const struct platform_device_id *id_entry =
1709 platform_get_device_id(fep->pdev); 1718 platform_get_device_id(fep->pdev);
1719 struct device_node *node;
1710 int err = -ENXIO, i; 1720 int err = -ENXIO, i;
1711 1721
1712 /* 1722 /*
@@ -1774,7 +1784,15 @@ static int fec_enet_mii_init(struct platform_device *pdev)
1774 for (i = 0; i < PHY_MAX_ADDR; i++) 1784 for (i = 0; i < PHY_MAX_ADDR; i++)
1775 fep->mii_bus->irq[i] = PHY_POLL; 1785 fep->mii_bus->irq[i] = PHY_POLL;
1776 1786
1777 if (mdiobus_register(fep->mii_bus)) 1787 node = of_get_child_by_name(pdev->dev.of_node, "mdio");
1788 if (node) {
1789 err = of_mdiobus_register(fep->mii_bus, node);
1790 of_node_put(node);
1791 } else {
1792 err = mdiobus_register(fep->mii_bus);
1793 }
1794
1795 if (err)
1778 goto err_out_free_mdio_irq; 1796 goto err_out_free_mdio_irq;
1779 1797
1780 mii_cnt++; 1798 mii_cnt++;
@@ -2527,6 +2545,7 @@ fec_probe(struct platform_device *pdev)
2527 struct resource *r; 2545 struct resource *r;
2528 const struct of_device_id *of_id; 2546 const struct of_device_id *of_id;
2529 static int dev_id; 2547 static int dev_id;
2548 struct device_node *np = pdev->dev.of_node, *phy_node;
2530 2549
2531 of_id = of_match_device(fec_dt_ids, &pdev->dev); 2550 of_id = of_match_device(fec_dt_ids, &pdev->dev);
2532 if (of_id) 2551 if (of_id)
@@ -2566,6 +2585,18 @@ fec_probe(struct platform_device *pdev)
2566 2585
2567 platform_set_drvdata(pdev, ndev); 2586 platform_set_drvdata(pdev, ndev);
2568 2587
2588 phy_node = of_parse_phandle(np, "phy-handle", 0);
2589 if (!phy_node && of_phy_is_fixed_link(np)) {
2590 ret = of_phy_register_fixed_link(np);
2591 if (ret < 0) {
2592 dev_err(&pdev->dev,
2593 "broken fixed-link specification\n");
2594 goto failed_phy;
2595 }
2596 phy_node = of_node_get(np);
2597 }
2598 fep->phy_node = phy_node;
2599
2569 ret = of_get_phy_mode(pdev->dev.of_node); 2600 ret = of_get_phy_mode(pdev->dev.of_node);
2570 if (ret < 0) { 2601 if (ret < 0) {
2571 pdata = dev_get_platdata(&pdev->dev); 2602 pdata = dev_get_platdata(&pdev->dev);
@@ -2670,6 +2701,8 @@ failed_init:
2670failed_regulator: 2701failed_regulator:
2671 fec_enet_clk_enable(ndev, false); 2702 fec_enet_clk_enable(ndev, false);
2672failed_clk: 2703failed_clk:
2704failed_phy:
2705 of_node_put(phy_node);
2673failed_ioremap: 2706failed_ioremap:
2674 free_netdev(ndev); 2707 free_netdev(ndev);
2675 2708
@@ -2691,6 +2724,7 @@ fec_drv_remove(struct platform_device *pdev)
2691 if (fep->ptp_clock) 2724 if (fep->ptp_clock)
2692 ptp_clock_unregister(fep->ptp_clock); 2725 ptp_clock_unregister(fep->ptp_clock);
2693 fec_enet_clk_enable(ndev, false); 2726 fec_enet_clk_enable(ndev, false);
2727 of_node_put(fep->phy_node);
2694 free_netdev(ndev); 2728 free_netdev(ndev);
2695 2729
2696 return 0; 2730 return 0;
diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx.c b/drivers/net/ethernet/freescale/fec_mpc52xx.c
index 9947765e90c5..ff55fbb20a75 100644
--- a/drivers/net/ethernet/freescale/fec_mpc52xx.c
+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c
@@ -1015,8 +1015,7 @@ mpc52xx_fec_remove(struct platform_device *op)
1015 1015
1016 unregister_netdev(ndev); 1016 unregister_netdev(ndev);
1017 1017
1018 if (priv->phy_node) 1018 of_node_put(priv->phy_node);
1019 of_node_put(priv->phy_node);
1020 priv->phy_node = NULL; 1019 priv->phy_node = NULL;
1021 1020
1022 irq_dispose_mapping(ndev->irq); 1021 irq_dispose_mapping(ndev->irq);
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
index cfaf17b70f3f..748fd24d3d9e 100644
--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
@@ -1033,7 +1033,7 @@ static int fs_enet_probe(struct platform_device *ofdev)
1033 /* In the case of a fixed PHY, the DT node associated 1033 /* In the case of a fixed PHY, the DT node associated
1034 * to the PHY is the Ethernet MAC DT node. 1034 * to the PHY is the Ethernet MAC DT node.
1035 */ 1035 */
1036 fpi->phy_node = ofdev->dev.of_node; 1036 fpi->phy_node = of_node_get(ofdev->dev.of_node);
1037 } 1037 }
1038 1038
1039 if (of_device_is_compatible(ofdev->dev.of_node, "fsl,mpc5125-fec")) { 1039 if (of_device_is_compatible(ofdev->dev.of_node, "fsl,mpc5125-fec")) {
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index a6cf40e62f3a..fb29d049f4e1 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -892,12 +892,12 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)
892 /* In the case of a fixed PHY, the DT node associated 892 /* In the case of a fixed PHY, the DT node associated
893 * to the PHY is the Ethernet MAC DT node. 893 * to the PHY is the Ethernet MAC DT node.
894 */ 894 */
895 if (of_phy_is_fixed_link(np)) { 895 if (!priv->phy_node && of_phy_is_fixed_link(np)) {
896 err = of_phy_register_fixed_link(np); 896 err = of_phy_register_fixed_link(np);
897 if (err) 897 if (err)
898 goto err_grp_init; 898 goto err_grp_init;
899 899
900 priv->phy_node = np; 900 priv->phy_node = of_node_get(np);
901 } 901 }
902 902
903 /* Find the TBI PHY. If it's not there, we don't support SGMII */ 903 /* Find the TBI PHY. If it's not there, we don't support SGMII */
@@ -1435,10 +1435,8 @@ register_fail:
1435 unmap_group_regs(priv); 1435 unmap_group_regs(priv);
1436 gfar_free_rx_queues(priv); 1436 gfar_free_rx_queues(priv);
1437 gfar_free_tx_queues(priv); 1437 gfar_free_tx_queues(priv);
1438 if (priv->phy_node) 1438 of_node_put(priv->phy_node);
1439 of_node_put(priv->phy_node); 1439 of_node_put(priv->tbi_node);
1440 if (priv->tbi_node)
1441 of_node_put(priv->tbi_node);
1442 free_gfar_dev(priv); 1440 free_gfar_dev(priv);
1443 return err; 1441 return err;
1444} 1442}
@@ -1447,10 +1445,8 @@ static int gfar_remove(struct platform_device *ofdev)
1447{ 1445{
1448 struct gfar_private *priv = platform_get_drvdata(ofdev); 1446 struct gfar_private *priv = platform_get_drvdata(ofdev);
1449 1447
1450 if (priv->phy_node) 1448 of_node_put(priv->phy_node);
1451 of_node_put(priv->phy_node); 1449 of_node_put(priv->tbi_node);
1452 if (priv->tbi_node)
1453 of_node_put(priv->tbi_node);
1454 1450
1455 unregister_netdev(priv->ndev); 1451 unregister_netdev(priv->ndev);
1456 unmap_group_regs(priv); 1452 unmap_group_regs(priv);
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
index 8ceaf7a2660c..3cf0478b3728 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -3785,16 +3785,15 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3785 ug_info->uf_info.irq = irq_of_parse_and_map(np, 0); 3785 ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
3786 3786
3787 ug_info->phy_node = of_parse_phandle(np, "phy-handle", 0); 3787 ug_info->phy_node = of_parse_phandle(np, "phy-handle", 0);
3788 if (!ug_info->phy_node) { 3788 if (!ug_info->phy_node && of_phy_is_fixed_link(np)) {
3789 /* In the case of a fixed PHY, the DT node associated 3789 /*
3790 * In the case of a fixed PHY, the DT node associated
3790 * to the PHY is the Ethernet MAC DT node. 3791 * to the PHY is the Ethernet MAC DT node.
3791 */ 3792 */
3792 if (of_phy_is_fixed_link(np)) { 3793 err = of_phy_register_fixed_link(np);
3793 err = of_phy_register_fixed_link(np); 3794 if (err)
3794 if (err) 3795 return err;
3795 return err; 3796 ug_info->phy_node = of_node_get(np);
3796 }
3797 ug_info->phy_node = np;
3798 } 3797 }
3799 3798
3800 /* Find the TBI PHY node. If it's not there, we don't support SGMII */ 3799 /* Find the TBI PHY node. If it's not there, we don't support SGMII */
@@ -3862,8 +3861,11 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3862 /* Create an ethernet device instance */ 3861 /* Create an ethernet device instance */
3863 dev = alloc_etherdev(sizeof(*ugeth)); 3862 dev = alloc_etherdev(sizeof(*ugeth));
3864 3863
3865 if (dev == NULL) 3864 if (dev == NULL) {
3865 of_node_put(ug_info->tbi_node);
3866 of_node_put(ug_info->phy_node);
3866 return -ENOMEM; 3867 return -ENOMEM;
3868 }
3867 3869
3868 ugeth = netdev_priv(dev); 3870 ugeth = netdev_priv(dev);
3869 spin_lock_init(&ugeth->lock); 3871 spin_lock_init(&ugeth->lock);
@@ -3897,6 +3899,8 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3897 pr_err("%s: Cannot register net device, aborting\n", 3899 pr_err("%s: Cannot register net device, aborting\n",
3898 dev->name); 3900 dev->name);
3899 free_netdev(dev); 3901 free_netdev(dev);
3902 of_node_put(ug_info->tbi_node);
3903 of_node_put(ug_info->phy_node);
3900 return err; 3904 return err;
3901 } 3905 }
3902 3906
@@ -3920,6 +3924,8 @@ static int ucc_geth_remove(struct platform_device* ofdev)
3920 unregister_netdev(dev); 3924 unregister_netdev(dev);
3921 free_netdev(dev); 3925 free_netdev(dev);
3922 ucc_geth_memclean(ugeth); 3926 ucc_geth_memclean(ugeth);
3927 of_node_put(ugeth->ug_info->tbi_node);
3928 of_node_put(ugeth->ug_info->phy_node);
3923 3929
3924 return 0; 3930 return 0;
3925} 3931}
diff --git a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
index cfe7a7431730..a7139f588ad2 100644
--- a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
+++ b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c
@@ -99,23 +99,23 @@ static const struct ethtool_ops netdev_ethtool_ops;
99/* 99/*
100 card type 100 card type
101 */ 101 */
102typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN, 102enum cardtype { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN,
103 XXX10304, NEC, KME 103 XXX10304, NEC, KME
104} cardtype_t; 104};
105 105
106/* 106/*
107 driver specific data structure 107 driver specific data structure
108*/ 108*/
109typedef struct local_info_t { 109struct local_info {
110 struct pcmcia_device *p_dev; 110 struct pcmcia_device *p_dev;
111 long open_time; 111 long open_time;
112 uint tx_started:1; 112 uint tx_started:1;
113 uint tx_queue; 113 uint tx_queue;
114 u_short tx_queue_len; 114 u_short tx_queue_len;
115 cardtype_t cardtype; 115 enum cardtype cardtype;
116 u_short sent; 116 u_short sent;
117 u_char __iomem *base; 117 u_char __iomem *base;
118} local_info_t; 118};
119 119
120#define MC_FILTERBREAK 64 120#define MC_FILTERBREAK 64
121 121
@@ -232,13 +232,13 @@ static const struct net_device_ops fjn_netdev_ops = {
232 232
233static int fmvj18x_probe(struct pcmcia_device *link) 233static int fmvj18x_probe(struct pcmcia_device *link)
234{ 234{
235 local_info_t *lp; 235 struct local_info *lp;
236 struct net_device *dev; 236 struct net_device *dev;
237 237
238 dev_dbg(&link->dev, "fmvj18x_attach()\n"); 238 dev_dbg(&link->dev, "fmvj18x_attach()\n");
239 239
240 /* Make up a FMVJ18x specific data structure */ 240 /* Make up a FMVJ18x specific data structure */
241 dev = alloc_etherdev(sizeof(local_info_t)); 241 dev = alloc_etherdev(sizeof(struct local_info));
242 if (!dev) 242 if (!dev)
243 return -ENOMEM; 243 return -ENOMEM;
244 lp = netdev_priv(dev); 244 lp = netdev_priv(dev);
@@ -327,10 +327,10 @@ static int fmvj18x_ioprobe(struct pcmcia_device *p_dev, void *priv_data)
327static int fmvj18x_config(struct pcmcia_device *link) 327static int fmvj18x_config(struct pcmcia_device *link)
328{ 328{
329 struct net_device *dev = link->priv; 329 struct net_device *dev = link->priv;
330 local_info_t *lp = netdev_priv(dev); 330 struct local_info *lp = netdev_priv(dev);
331 int i, ret; 331 int i, ret;
332 unsigned int ioaddr; 332 unsigned int ioaddr;
333 cardtype_t cardtype; 333 enum cardtype cardtype;
334 char *card_name = "unknown"; 334 char *card_name = "unknown";
335 u8 *buf; 335 u8 *buf;
336 size_t len; 336 size_t len;
@@ -584,7 +584,7 @@ static int fmvj18x_setup_mfc(struct pcmcia_device *link)
584 int i; 584 int i;
585 struct net_device *dev = link->priv; 585 struct net_device *dev = link->priv;
586 unsigned int ioaddr; 586 unsigned int ioaddr;
587 local_info_t *lp = netdev_priv(dev); 587 struct local_info *lp = netdev_priv(dev);
588 588
589 /* Allocate a small memory window */ 589 /* Allocate a small memory window */
590 link->resource[3]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; 590 link->resource[3]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
@@ -626,7 +626,7 @@ static void fmvj18x_release(struct pcmcia_device *link)
626{ 626{
627 627
628 struct net_device *dev = link->priv; 628 struct net_device *dev = link->priv;
629 local_info_t *lp = netdev_priv(dev); 629 struct local_info *lp = netdev_priv(dev);
630 u_char __iomem *tmp; 630 u_char __iomem *tmp;
631 631
632 dev_dbg(&link->dev, "fmvj18x_release\n"); 632 dev_dbg(&link->dev, "fmvj18x_release\n");
@@ -711,7 +711,7 @@ module_pcmcia_driver(fmvj18x_cs_driver);
711static irqreturn_t fjn_interrupt(int dummy, void *dev_id) 711static irqreturn_t fjn_interrupt(int dummy, void *dev_id)
712{ 712{
713 struct net_device *dev = dev_id; 713 struct net_device *dev = dev_id;
714 local_info_t *lp = netdev_priv(dev); 714 struct local_info *lp = netdev_priv(dev);
715 unsigned int ioaddr; 715 unsigned int ioaddr;
716 unsigned short tx_stat, rx_stat; 716 unsigned short tx_stat, rx_stat;
717 717
@@ -772,7 +772,7 @@ static irqreturn_t fjn_interrupt(int dummy, void *dev_id)
772 772
773static void fjn_tx_timeout(struct net_device *dev) 773static void fjn_tx_timeout(struct net_device *dev)
774{ 774{
775 struct local_info_t *lp = netdev_priv(dev); 775 struct local_info *lp = netdev_priv(dev);
776 unsigned int ioaddr = dev->base_addr; 776 unsigned int ioaddr = dev->base_addr;
777 777
778 netdev_notice(dev, "transmit timed out with status %04x, %s?\n", 778 netdev_notice(dev, "transmit timed out with status %04x, %s?\n",
@@ -802,7 +802,7 @@ static void fjn_tx_timeout(struct net_device *dev)
802static netdev_tx_t fjn_start_xmit(struct sk_buff *skb, 802static netdev_tx_t fjn_start_xmit(struct sk_buff *skb,
803 struct net_device *dev) 803 struct net_device *dev)
804{ 804{
805 struct local_info_t *lp = netdev_priv(dev); 805 struct local_info *lp = netdev_priv(dev);
806 unsigned int ioaddr = dev->base_addr; 806 unsigned int ioaddr = dev->base_addr;
807 short length = skb->len; 807 short length = skb->len;
808 808
@@ -874,7 +874,7 @@ static netdev_tx_t fjn_start_xmit(struct sk_buff *skb,
874 874
875static void fjn_reset(struct net_device *dev) 875static void fjn_reset(struct net_device *dev)
876{ 876{
877 struct local_info_t *lp = netdev_priv(dev); 877 struct local_info *lp = netdev_priv(dev);
878 unsigned int ioaddr = dev->base_addr; 878 unsigned int ioaddr = dev->base_addr;
879 int i; 879 int i;
880 880
@@ -1058,7 +1058,7 @@ static int fjn_config(struct net_device *dev, struct ifmap *map){
1058 1058
1059static int fjn_open(struct net_device *dev) 1059static int fjn_open(struct net_device *dev)
1060{ 1060{
1061 struct local_info_t *lp = netdev_priv(dev); 1061 struct local_info *lp = netdev_priv(dev);
1062 struct pcmcia_device *link = lp->p_dev; 1062 struct pcmcia_device *link = lp->p_dev;
1063 1063
1064 pr_debug("fjn_open('%s').\n", dev->name); 1064 pr_debug("fjn_open('%s').\n", dev->name);
@@ -1083,7 +1083,7 @@ static int fjn_open(struct net_device *dev)
1083 1083
1084static int fjn_close(struct net_device *dev) 1084static int fjn_close(struct net_device *dev)
1085{ 1085{
1086 struct local_info_t *lp = netdev_priv(dev); 1086 struct local_info *lp = netdev_priv(dev);
1087 struct pcmcia_device *link = lp->p_dev; 1087 struct pcmcia_device *link = lp->p_dev;
1088 unsigned int ioaddr = dev->base_addr; 1088 unsigned int ioaddr = dev->base_addr;
1089 1089
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index dadd9a5f6323..c9f1d1b7ef37 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -2969,14 +2969,14 @@ static int mvneta_probe(struct platform_device *pdev)
2969 /* In the case of a fixed PHY, the DT node associated 2969 /* In the case of a fixed PHY, the DT node associated
2970 * to the PHY is the Ethernet MAC DT node. 2970 * to the PHY is the Ethernet MAC DT node.
2971 */ 2971 */
2972 phy_node = dn; 2972 phy_node = of_node_get(dn);
2973 } 2973 }
2974 2974
2975 phy_mode = of_get_phy_mode(dn); 2975 phy_mode = of_get_phy_mode(dn);
2976 if (phy_mode < 0) { 2976 if (phy_mode < 0) {
2977 dev_err(&pdev->dev, "incorrect phy-mode\n"); 2977 dev_err(&pdev->dev, "incorrect phy-mode\n");
2978 err = -EINVAL; 2978 err = -EINVAL;
2979 goto err_free_irq; 2979 goto err_put_phy_node;
2980 } 2980 }
2981 2981
2982 dev->tx_queue_len = MVNETA_MAX_TXD; 2982 dev->tx_queue_len = MVNETA_MAX_TXD;
@@ -2992,7 +2992,7 @@ static int mvneta_probe(struct platform_device *pdev)
2992 pp->clk = devm_clk_get(&pdev->dev, NULL); 2992 pp->clk = devm_clk_get(&pdev->dev, NULL);
2993 if (IS_ERR(pp->clk)) { 2993 if (IS_ERR(pp->clk)) {
2994 err = PTR_ERR(pp->clk); 2994 err = PTR_ERR(pp->clk);
2995 goto err_free_irq; 2995 goto err_put_phy_node;
2996 } 2996 }
2997 2997
2998 clk_prepare_enable(pp->clk); 2998 clk_prepare_enable(pp->clk);
@@ -3071,6 +3071,8 @@ err_free_stats:
3071 free_percpu(pp->stats); 3071 free_percpu(pp->stats);
3072err_clk: 3072err_clk:
3073 clk_disable_unprepare(pp->clk); 3073 clk_disable_unprepare(pp->clk);
3074err_put_phy_node:
3075 of_node_put(phy_node);
3074err_free_irq: 3076err_free_irq:
3075 irq_dispose_mapping(dev->irq); 3077 irq_dispose_mapping(dev->irq);
3076err_free_netdev: 3078err_free_netdev:
@@ -3088,6 +3090,7 @@ static int mvneta_remove(struct platform_device *pdev)
3088 clk_disable_unprepare(pp->clk); 3090 clk_disable_unprepare(pp->clk);
3089 free_percpu(pp->stats); 3091 free_percpu(pp->stats);
3090 irq_dispose_mapping(dev->irq); 3092 irq_dispose_mapping(dev->irq);
3093 of_node_put(pp->phy_node);
3091 free_netdev(dev); 3094 free_netdev(dev);
3092 3095
3093 return 0; 3096 return 0;
diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
index f3d5d79f1cd1..69c26f04d8ce 100644
--- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
+++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
@@ -574,6 +574,7 @@ myri10ge_validate_firmware(struct myri10ge_priv *mgp,
574 574
575 /* save firmware version for ethtool */ 575 /* save firmware version for ethtool */
576 strncpy(mgp->fw_version, hdr->version, sizeof(mgp->fw_version)); 576 strncpy(mgp->fw_version, hdr->version, sizeof(mgp->fw_version));
577 mgp->fw_version[sizeof(mgp->fw_version) - 1] = '\0';
577 578
578 sscanf(mgp->fw_version, "%d.%d.%d", &mgp->fw_ver_major, 579 sscanf(mgp->fw_version, "%d.%d.%d", &mgp->fw_ver_major,
579 &mgp->fw_ver_minor, &mgp->fw_ver_tiny); 580 &mgp->fw_ver_minor, &mgp->fw_ver_tiny);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/Makefile b/drivers/net/ethernet/qlogic/qlcnic/Makefile
index a848d2979722..3c2c2c7c1559 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/Makefile
+++ b/drivers/net/ethernet/qlogic/qlcnic/Makefile
@@ -8,7 +8,7 @@ qlcnic-y := qlcnic_hw.o qlcnic_main.o qlcnic_init.o \
8 qlcnic_ethtool.o qlcnic_ctx.o qlcnic_io.o \ 8 qlcnic_ethtool.o qlcnic_ctx.o qlcnic_io.o \
9 qlcnic_sysfs.o qlcnic_minidump.o qlcnic_83xx_hw.o \ 9 qlcnic_sysfs.o qlcnic_minidump.o qlcnic_83xx_hw.o \
10 qlcnic_83xx_init.o qlcnic_83xx_vnic.o \ 10 qlcnic_83xx_init.o qlcnic_83xx_vnic.o \
11 qlcnic_minidump.o qlcnic_sriov_common.o 11 qlcnic_sriov_common.o
12 12
13qlcnic-$(CONFIG_QLCNIC_SRIOV) += qlcnic_sriov_pf.o 13qlcnic-$(CONFIG_QLCNIC_SRIOV) += qlcnic_sriov_pf.o
14 14
diff --git a/drivers/net/ethernet/smsc/smsc911x.h b/drivers/net/ethernet/smsc/smsc911x.h
index 23953957fed8..54d648920a1b 100644
--- a/drivers/net/ethernet/smsc/smsc911x.h
+++ b/drivers/net/ethernet/smsc/smsc911x.h
@@ -51,7 +51,7 @@
51 51
52#ifdef CONFIG_DEBUG_SPINLOCK 52#ifdef CONFIG_DEBUG_SPINLOCK
53#define SMSC_ASSERT_MAC_LOCK(pdata) \ 53#define SMSC_ASSERT_MAC_LOCK(pdata) \
54 WARN_ON(!spin_is_locked(&pdata->mac_lock)) 54 WARN_ON_SMP(!spin_is_locked(&pdata->mac_lock))
55#else 55#else
56#define SMSC_ASSERT_MAC_LOCK(pdata) do {} while (0) 56#define SMSC_ASSERT_MAC_LOCK(pdata) do {} while (0)
57#endif /* CONFIG_DEBUG_SPINLOCK */ 57#endif /* CONFIG_DEBUG_SPINLOCK */
diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c
index 3809f4ec2820..f9bcf7aa88ca 100644
--- a/drivers/net/ethernet/ti/cpmac.c
+++ b/drivers/net/ethernet/ti/cpmac.c
@@ -1130,6 +1130,7 @@ static int cpmac_probe(struct platform_device *pdev)
1130 strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */ 1130 strncpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); /* fixed phys bus */
1131 phy_id = pdev->id; 1131 phy_id = pdev->id;
1132 } 1132 }
1133 mdio_bus_id[sizeof(mdio_bus_id) - 1] = '\0';
1133 1134
1134 dev = alloc_etherdev_mq(sizeof(*priv), CPMAC_QUEUES); 1135 dev = alloc_etherdev_mq(sizeof(*priv), CPMAC_QUEUES);
1135 if (!dev) 1136 if (!dev)
diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c
index 8a6e5c2d6f95..36f4459520c3 100644
--- a/drivers/net/ethernet/xilinx/ll_temac_main.c
+++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
@@ -1148,8 +1148,7 @@ static int temac_of_remove(struct platform_device *op)
1148 temac_mdio_teardown(lp); 1148 temac_mdio_teardown(lp);
1149 unregister_netdev(ndev); 1149 unregister_netdev(ndev);
1150 sysfs_remove_group(&lp->dev->kobj, &temac_attr_group); 1150 sysfs_remove_group(&lp->dev->kobj, &temac_attr_group);
1151 if (lp->phy_node) 1151 of_node_put(lp->phy_node);
1152 of_node_put(lp->phy_node);
1153 lp->phy_node = NULL; 1152 lp->phy_node = NULL;
1154 iounmap(lp->regs); 1153 iounmap(lp->regs);
1155 if (lp->sdma_regs) 1154 if (lp->sdma_regs)
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index 7b0a73556264..30e8608ff050 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -1630,8 +1630,7 @@ static int axienet_of_remove(struct platform_device *op)
1630 axienet_mdio_teardown(lp); 1630 axienet_mdio_teardown(lp);
1631 unregister_netdev(ndev); 1631 unregister_netdev(ndev);
1632 1632
1633 if (lp->phy_node) 1633 of_node_put(lp->phy_node);
1634 of_node_put(lp->phy_node);
1635 lp->phy_node = NULL; 1634 lp->phy_node = NULL;
1636 1635
1637 iounmap(lp->regs); 1636 iounmap(lp->regs);
diff --git a/drivers/net/ethernet/xircom/xirc2ps_cs.c b/drivers/net/ethernet/xircom/xirc2ps_cs.c
index 7c81ffb861e8..d56f8693202b 100644
--- a/drivers/net/ethernet/xircom/xirc2ps_cs.c
+++ b/drivers/net/ethernet/xircom/xirc2ps_cs.c
@@ -266,7 +266,7 @@ static void xirc2ps_detach(struct pcmcia_device *p_dev);
266 266
267static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id); 267static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id);
268 268
269typedef struct local_info_t { 269struct local_info {
270 struct net_device *dev; 270 struct net_device *dev;
271 struct pcmcia_device *p_dev; 271 struct pcmcia_device *p_dev;
272 272
@@ -281,7 +281,7 @@ typedef struct local_info_t {
281 unsigned last_ptr_value; /* last packets transmitted value */ 281 unsigned last_ptr_value; /* last packets transmitted value */
282 const char *manf_str; 282 const char *manf_str;
283 struct work_struct tx_timeout_task; 283 struct work_struct tx_timeout_task;
284} local_info_t; 284};
285 285
286/**************** 286/****************
287 * Some more prototypes 287 * Some more prototypes
@@ -475,12 +475,12 @@ static int
475xirc2ps_probe(struct pcmcia_device *link) 475xirc2ps_probe(struct pcmcia_device *link)
476{ 476{
477 struct net_device *dev; 477 struct net_device *dev;
478 local_info_t *local; 478 struct local_info *local;
479 479
480 dev_dbg(&link->dev, "attach()\n"); 480 dev_dbg(&link->dev, "attach()\n");
481 481
482 /* Allocate the device structure */ 482 /* Allocate the device structure */
483 dev = alloc_etherdev(sizeof(local_info_t)); 483 dev = alloc_etherdev(sizeof(struct local_info));
484 if (!dev) 484 if (!dev)
485 return -ENOMEM; 485 return -ENOMEM;
486 local = netdev_priv(dev); 486 local = netdev_priv(dev);
@@ -536,7 +536,7 @@ static int
536set_card_type(struct pcmcia_device *link) 536set_card_type(struct pcmcia_device *link)
537{ 537{
538 struct net_device *dev = link->priv; 538 struct net_device *dev = link->priv;
539 local_info_t *local = netdev_priv(dev); 539 struct local_info *local = netdev_priv(dev);
540 u8 *buf; 540 u8 *buf;
541 unsigned int cisrev, mediaid, prodid; 541 unsigned int cisrev, mediaid, prodid;
542 size_t len; 542 size_t len;
@@ -690,7 +690,7 @@ static int
690xirc2ps_config(struct pcmcia_device * link) 690xirc2ps_config(struct pcmcia_device * link)
691{ 691{
692 struct net_device *dev = link->priv; 692 struct net_device *dev = link->priv;
693 local_info_t *local = netdev_priv(dev); 693 struct local_info *local = netdev_priv(dev);
694 unsigned int ioaddr; 694 unsigned int ioaddr;
695 int err; 695 int err;
696 u8 *buf; 696 u8 *buf;
@@ -931,7 +931,7 @@ xirc2ps_release(struct pcmcia_device *link)
931 931
932 if (link->resource[2]->end) { 932 if (link->resource[2]->end) {
933 struct net_device *dev = link->priv; 933 struct net_device *dev = link->priv;
934 local_info_t *local = netdev_priv(dev); 934 struct local_info *local = netdev_priv(dev);
935 if (local->dingo) 935 if (local->dingo)
936 iounmap(local->dingo_ccr - 0x0800); 936 iounmap(local->dingo_ccr - 0x0800);
937 } 937 }
@@ -975,7 +975,7 @@ static irqreturn_t
975xirc2ps_interrupt(int irq, void *dev_id) 975xirc2ps_interrupt(int irq, void *dev_id)
976{ 976{
977 struct net_device *dev = (struct net_device *)dev_id; 977 struct net_device *dev = (struct net_device *)dev_id;
978 local_info_t *lp = netdev_priv(dev); 978 struct local_info *lp = netdev_priv(dev);
979 unsigned int ioaddr; 979 unsigned int ioaddr;
980 u_char saved_page; 980 u_char saved_page;
981 unsigned bytes_rcvd; 981 unsigned bytes_rcvd;
@@ -1194,8 +1194,8 @@ xirc2ps_interrupt(int irq, void *dev_id)
1194static void 1194static void
1195xirc2ps_tx_timeout_task(struct work_struct *work) 1195xirc2ps_tx_timeout_task(struct work_struct *work)
1196{ 1196{
1197 local_info_t *local = 1197 struct local_info *local =
1198 container_of(work, local_info_t, tx_timeout_task); 1198 container_of(work, struct local_info, tx_timeout_task);
1199 struct net_device *dev = local->dev; 1199 struct net_device *dev = local->dev;
1200 /* reset the card */ 1200 /* reset the card */
1201 do_reset(dev,1); 1201 do_reset(dev,1);
@@ -1206,7 +1206,7 @@ xirc2ps_tx_timeout_task(struct work_struct *work)
1206static void 1206static void
1207xirc_tx_timeout(struct net_device *dev) 1207xirc_tx_timeout(struct net_device *dev)
1208{ 1208{
1209 local_info_t *lp = netdev_priv(dev); 1209 struct local_info *lp = netdev_priv(dev);
1210 dev->stats.tx_errors++; 1210 dev->stats.tx_errors++;
1211 netdev_notice(dev, "transmit timed out\n"); 1211 netdev_notice(dev, "transmit timed out\n");
1212 schedule_work(&lp->tx_timeout_task); 1212 schedule_work(&lp->tx_timeout_task);
@@ -1215,7 +1215,7 @@ xirc_tx_timeout(struct net_device *dev)
1215static netdev_tx_t 1215static netdev_tx_t
1216do_start_xmit(struct sk_buff *skb, struct net_device *dev) 1216do_start_xmit(struct sk_buff *skb, struct net_device *dev)
1217{ 1217{
1218 local_info_t *lp = netdev_priv(dev); 1218 struct local_info *lp = netdev_priv(dev);
1219 unsigned int ioaddr = dev->base_addr; 1219 unsigned int ioaddr = dev->base_addr;
1220 int okay; 1220 int okay;
1221 unsigned freespace; 1221 unsigned freespace;
@@ -1300,7 +1300,7 @@ static void set_address(struct set_address_info *sa_info, char *addr)
1300static void set_addresses(struct net_device *dev) 1300static void set_addresses(struct net_device *dev)
1301{ 1301{
1302 unsigned int ioaddr = dev->base_addr; 1302 unsigned int ioaddr = dev->base_addr;
1303 local_info_t *lp = netdev_priv(dev); 1303 struct local_info *lp = netdev_priv(dev);
1304 struct netdev_hw_addr *ha; 1304 struct netdev_hw_addr *ha;
1305 struct set_address_info sa_info; 1305 struct set_address_info sa_info;
1306 int i; 1306 int i;
@@ -1362,7 +1362,7 @@ set_multicast_list(struct net_device *dev)
1362static int 1362static int
1363do_config(struct net_device *dev, struct ifmap *map) 1363do_config(struct net_device *dev, struct ifmap *map)
1364{ 1364{
1365 local_info_t *local = netdev_priv(dev); 1365 struct local_info *local = netdev_priv(dev);
1366 1366
1367 pr_debug("do_config(%p)\n", dev); 1367 pr_debug("do_config(%p)\n", dev);
1368 if (map->port != 255 && map->port != dev->if_port) { 1368 if (map->port != 255 && map->port != dev->if_port) {
@@ -1387,7 +1387,7 @@ do_config(struct net_device *dev, struct ifmap *map)
1387static int 1387static int
1388do_open(struct net_device *dev) 1388do_open(struct net_device *dev)
1389{ 1389{
1390 local_info_t *lp = netdev_priv(dev); 1390 struct local_info *lp = netdev_priv(dev);
1391 struct pcmcia_device *link = lp->p_dev; 1391 struct pcmcia_device *link = lp->p_dev;
1392 1392
1393 dev_dbg(&link->dev, "do_open(%p)\n", dev); 1393 dev_dbg(&link->dev, "do_open(%p)\n", dev);
@@ -1421,7 +1421,7 @@ static const struct ethtool_ops netdev_ethtool_ops = {
1421static int 1421static int
1422do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 1422do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1423{ 1423{
1424 local_info_t *local = netdev_priv(dev); 1424 struct local_info *local = netdev_priv(dev);
1425 unsigned int ioaddr = dev->base_addr; 1425 unsigned int ioaddr = dev->base_addr;
1426 struct mii_ioctl_data *data = if_mii(rq); 1426 struct mii_ioctl_data *data = if_mii(rq);
1427 1427
@@ -1453,7 +1453,7 @@ do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1453static void 1453static void
1454hardreset(struct net_device *dev) 1454hardreset(struct net_device *dev)
1455{ 1455{
1456 local_info_t *local = netdev_priv(dev); 1456 struct local_info *local = netdev_priv(dev);
1457 unsigned int ioaddr = dev->base_addr; 1457 unsigned int ioaddr = dev->base_addr;
1458 1458
1459 SelectPage(4); 1459 SelectPage(4);
@@ -1470,7 +1470,7 @@ hardreset(struct net_device *dev)
1470static void 1470static void
1471do_reset(struct net_device *dev, int full) 1471do_reset(struct net_device *dev, int full)
1472{ 1472{
1473 local_info_t *local = netdev_priv(dev); 1473 struct local_info *local = netdev_priv(dev);
1474 unsigned int ioaddr = dev->base_addr; 1474 unsigned int ioaddr = dev->base_addr;
1475 unsigned value; 1475 unsigned value;
1476 1476
@@ -1631,7 +1631,7 @@ do_reset(struct net_device *dev, int full)
1631static int 1631static int
1632init_mii(struct net_device *dev) 1632init_mii(struct net_device *dev)
1633{ 1633{
1634 local_info_t *local = netdev_priv(dev); 1634 struct local_info *local = netdev_priv(dev);
1635 unsigned int ioaddr = dev->base_addr; 1635 unsigned int ioaddr = dev->base_addr;
1636 unsigned control, status, linkpartner; 1636 unsigned control, status, linkpartner;
1637 int i; 1637 int i;
@@ -1715,7 +1715,7 @@ static int
1715do_stop(struct net_device *dev) 1715do_stop(struct net_device *dev)
1716{ 1716{
1717 unsigned int ioaddr = dev->base_addr; 1717 unsigned int ioaddr = dev->base_addr;
1718 local_info_t *lp = netdev_priv(dev); 1718 struct local_info *lp = netdev_priv(dev);
1719 struct pcmcia_device *link = lp->p_dev; 1719 struct pcmcia_device *link = lp->p_dev;
1720 1720
1721 dev_dbg(&link->dev, "do_stop(%p)\n", dev); 1721 dev_dbg(&link->dev, "do_stop(%p)\n", dev);
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c
index 7cc64eac0fa3..e5c7e6165a4b 100644
--- a/drivers/net/wan/hdlc_fr.c
+++ b/drivers/net/wan/hdlc_fr.c
@@ -90,7 +90,7 @@
90#define LMI_ANSI_LENGTH 14 90#define LMI_ANSI_LENGTH 14
91 91
92 92
93typedef struct { 93struct fr_hdr {
94#if defined(__LITTLE_ENDIAN_BITFIELD) 94#if defined(__LITTLE_ENDIAN_BITFIELD)
95 unsigned ea1: 1; 95 unsigned ea1: 1;
96 unsigned cr: 1; 96 unsigned cr: 1;
@@ -112,14 +112,14 @@ typedef struct {
112 unsigned de: 1; 112 unsigned de: 1;
113 unsigned ea2: 1; 113 unsigned ea2: 1;
114#endif 114#endif
115}__packed fr_hdr; 115} __packed;
116 116
117 117
118typedef struct pvc_device_struct { 118struct pvc_device {
119 struct net_device *frad; 119 struct net_device *frad;
120 struct net_device *main; 120 struct net_device *main;
121 struct net_device *ether; /* bridged Ethernet interface */ 121 struct net_device *ether; /* bridged Ethernet interface */
122 struct pvc_device_struct *next; /* Sorted in ascending DLCI order */ 122 struct pvc_device *next; /* Sorted in ascending DLCI order */
123 int dlci; 123 int dlci;
124 int open_count; 124 int open_count;
125 125
@@ -132,11 +132,11 @@ typedef struct pvc_device_struct {
132 unsigned int becn: 1; 132 unsigned int becn: 1;
133 unsigned int bandwidth; /* Cisco LMI reporting only */ 133 unsigned int bandwidth; /* Cisco LMI reporting only */
134 }state; 134 }state;
135}pvc_device; 135};
136 136
137struct frad_state { 137struct frad_state {
138 fr_proto settings; 138 fr_proto settings;
139 pvc_device *first_pvc; 139 struct pvc_device *first_pvc;
140 int dce_pvc_count; 140 int dce_pvc_count;
141 141
142 struct timer_list timer; 142 struct timer_list timer;
@@ -174,9 +174,9 @@ static inline struct frad_state* state(hdlc_device *hdlc)
174} 174}
175 175
176 176
177static inline pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci) 177static inline struct pvc_device *find_pvc(hdlc_device *hdlc, u16 dlci)
178{ 178{
179 pvc_device *pvc = state(hdlc)->first_pvc; 179 struct pvc_device *pvc = state(hdlc)->first_pvc;
180 180
181 while (pvc) { 181 while (pvc) {
182 if (pvc->dlci == dlci) 182 if (pvc->dlci == dlci)
@@ -190,10 +190,10 @@ static inline pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci)
190} 190}
191 191
192 192
193static pvc_device* add_pvc(struct net_device *dev, u16 dlci) 193static struct pvc_device *add_pvc(struct net_device *dev, u16 dlci)
194{ 194{
195 hdlc_device *hdlc = dev_to_hdlc(dev); 195 hdlc_device *hdlc = dev_to_hdlc(dev);
196 pvc_device *pvc, **pvc_p = &state(hdlc)->first_pvc; 196 struct pvc_device *pvc, **pvc_p = &state(hdlc)->first_pvc;
197 197
198 while (*pvc_p) { 198 while (*pvc_p) {
199 if ((*pvc_p)->dlci == dlci) 199 if ((*pvc_p)->dlci == dlci)
@@ -203,7 +203,7 @@ static pvc_device* add_pvc(struct net_device *dev, u16 dlci)
203 pvc_p = &(*pvc_p)->next; 203 pvc_p = &(*pvc_p)->next;
204 } 204 }
205 205
206 pvc = kzalloc(sizeof(pvc_device), GFP_ATOMIC); 206 pvc = kzalloc(sizeof(*pvc), GFP_ATOMIC);
207#ifdef DEBUG_PVC 207#ifdef DEBUG_PVC
208 printk(KERN_DEBUG "add_pvc: allocated pvc %p, frad %p\n", pvc, dev); 208 printk(KERN_DEBUG "add_pvc: allocated pvc %p, frad %p\n", pvc, dev);
209#endif 209#endif
@@ -218,13 +218,13 @@ static pvc_device* add_pvc(struct net_device *dev, u16 dlci)
218} 218}
219 219
220 220
221static inline int pvc_is_used(pvc_device *pvc) 221static inline int pvc_is_used(struct pvc_device *pvc)
222{ 222{
223 return pvc->main || pvc->ether; 223 return pvc->main || pvc->ether;
224} 224}
225 225
226 226
227static inline void pvc_carrier(int on, pvc_device *pvc) 227static inline void pvc_carrier(int on, struct pvc_device *pvc)
228{ 228{
229 if (on) { 229 if (on) {
230 if (pvc->main) 230 if (pvc->main)
@@ -246,11 +246,11 @@ static inline void pvc_carrier(int on, pvc_device *pvc)
246 246
247static inline void delete_unused_pvcs(hdlc_device *hdlc) 247static inline void delete_unused_pvcs(hdlc_device *hdlc)
248{ 248{
249 pvc_device **pvc_p = &state(hdlc)->first_pvc; 249 struct pvc_device **pvc_p = &state(hdlc)->first_pvc;
250 250
251 while (*pvc_p) { 251 while (*pvc_p) {
252 if (!pvc_is_used(*pvc_p)) { 252 if (!pvc_is_used(*pvc_p)) {
253 pvc_device *pvc = *pvc_p; 253 struct pvc_device *pvc = *pvc_p;
254#ifdef DEBUG_PVC 254#ifdef DEBUG_PVC
255 printk(KERN_DEBUG "freeing unused pvc: %p\n", pvc); 255 printk(KERN_DEBUG "freeing unused pvc: %p\n", pvc);
256#endif 256#endif
@@ -263,7 +263,8 @@ static inline void delete_unused_pvcs(hdlc_device *hdlc)
263} 263}
264 264
265 265
266static inline struct net_device** get_dev_p(pvc_device *pvc, int type) 266static inline struct net_device **get_dev_p(struct pvc_device *pvc,
267 int type)
267{ 268{
268 if (type == ARPHRD_ETHER) 269 if (type == ARPHRD_ETHER)
269 return &pvc->ether; 270 return &pvc->ether;
@@ -342,7 +343,7 @@ static int fr_hard_header(struct sk_buff **skb_p, u16 dlci)
342 343
343static int pvc_open(struct net_device *dev) 344static int pvc_open(struct net_device *dev)
344{ 345{
345 pvc_device *pvc = dev->ml_priv; 346 struct pvc_device *pvc = dev->ml_priv;
346 347
347 if ((pvc->frad->flags & IFF_UP) == 0) 348 if ((pvc->frad->flags & IFF_UP) == 0)
348 return -EIO; /* Frad must be UP in order to activate PVC */ 349 return -EIO; /* Frad must be UP in order to activate PVC */
@@ -362,7 +363,7 @@ static int pvc_open(struct net_device *dev)
362 363
363static int pvc_close(struct net_device *dev) 364static int pvc_close(struct net_device *dev)
364{ 365{
365 pvc_device *pvc = dev->ml_priv; 366 struct pvc_device *pvc = dev->ml_priv;
366 367
367 if (--pvc->open_count == 0) { 368 if (--pvc->open_count == 0) {
368 hdlc_device *hdlc = dev_to_hdlc(pvc->frad); 369 hdlc_device *hdlc = dev_to_hdlc(pvc->frad);
@@ -381,7 +382,7 @@ static int pvc_close(struct net_device *dev)
381 382
382static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 383static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
383{ 384{
384 pvc_device *pvc = dev->ml_priv; 385 struct pvc_device *pvc = dev->ml_priv;
385 fr_proto_pvc_info info; 386 fr_proto_pvc_info info;
386 387
387 if (ifr->ifr_settings.type == IF_GET_PROTO) { 388 if (ifr->ifr_settings.type == IF_GET_PROTO) {
@@ -409,7 +410,7 @@ static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
409 410
410static netdev_tx_t pvc_xmit(struct sk_buff *skb, struct net_device *dev) 411static netdev_tx_t pvc_xmit(struct sk_buff *skb, struct net_device *dev)
411{ 412{
412 pvc_device *pvc = dev->ml_priv; 413 struct pvc_device *pvc = dev->ml_priv;
413 414
414 if (pvc->state.active) { 415 if (pvc->state.active) {
415 if (dev->type == ARPHRD_ETHER) { 416 if (dev->type == ARPHRD_ETHER) {
@@ -444,7 +445,7 @@ static netdev_tx_t pvc_xmit(struct sk_buff *skb, struct net_device *dev)
444 return NETDEV_TX_OK; 445 return NETDEV_TX_OK;
445} 446}
446 447
447static inline void fr_log_dlci_active(pvc_device *pvc) 448static inline void fr_log_dlci_active(struct pvc_device *pvc)
448{ 449{
449 netdev_info(pvc->frad, "DLCI %d [%s%s%s]%s %s\n", 450 netdev_info(pvc->frad, "DLCI %d [%s%s%s]%s %s\n",
450 pvc->dlci, 451 pvc->dlci,
@@ -469,7 +470,7 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)
469{ 470{
470 hdlc_device *hdlc = dev_to_hdlc(dev); 471 hdlc_device *hdlc = dev_to_hdlc(dev);
471 struct sk_buff *skb; 472 struct sk_buff *skb;
472 pvc_device *pvc = state(hdlc)->first_pvc; 473 struct pvc_device *pvc = state(hdlc)->first_pvc;
473 int lmi = state(hdlc)->settings.lmi; 474 int lmi = state(hdlc)->settings.lmi;
474 int dce = state(hdlc)->settings.dce; 475 int dce = state(hdlc)->settings.dce;
475 int len = lmi == LMI_ANSI ? LMI_ANSI_LENGTH : LMI_CCITT_CISCO_LENGTH; 476 int len = lmi == LMI_ANSI ? LMI_ANSI_LENGTH : LMI_CCITT_CISCO_LENGTH;
@@ -566,7 +567,7 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)
566static void fr_set_link_state(int reliable, struct net_device *dev) 567static void fr_set_link_state(int reliable, struct net_device *dev)
567{ 568{
568 hdlc_device *hdlc = dev_to_hdlc(dev); 569 hdlc_device *hdlc = dev_to_hdlc(dev);
569 pvc_device *pvc = state(hdlc)->first_pvc; 570 struct pvc_device *pvc = state(hdlc)->first_pvc;
570 571
571 state(hdlc)->reliable = reliable; 572 state(hdlc)->reliable = reliable;
572 if (reliable) { 573 if (reliable) {
@@ -652,7 +653,7 @@ static void fr_timer(unsigned long arg)
652static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb) 653static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)
653{ 654{
654 hdlc_device *hdlc = dev_to_hdlc(dev); 655 hdlc_device *hdlc = dev_to_hdlc(dev);
655 pvc_device *pvc; 656 struct pvc_device *pvc;
656 u8 rxseq, txseq; 657 u8 rxseq, txseq;
657 int lmi = state(hdlc)->settings.lmi; 658 int lmi = state(hdlc)->settings.lmi;
658 int dce = state(hdlc)->settings.dce; 659 int dce = state(hdlc)->settings.dce;
@@ -869,10 +870,10 @@ static int fr_rx(struct sk_buff *skb)
869{ 870{
870 struct net_device *frad = skb->dev; 871 struct net_device *frad = skb->dev;
871 hdlc_device *hdlc = dev_to_hdlc(frad); 872 hdlc_device *hdlc = dev_to_hdlc(frad);
872 fr_hdr *fh = (fr_hdr*)skb->data; 873 struct fr_hdr *fh = (struct fr_hdr *)skb->data;
873 u8 *data = skb->data; 874 u8 *data = skb->data;
874 u16 dlci; 875 u16 dlci;
875 pvc_device *pvc; 876 struct pvc_device *pvc;
876 struct net_device *dev = NULL; 877 struct net_device *dev = NULL;
877 878
878 if (skb->len <= 4 || fh->ea1 || data[2] != FR_UI) 879 if (skb->len <= 4 || fh->ea1 || data[2] != FR_UI)
@@ -1028,7 +1029,7 @@ static void fr_stop(struct net_device *dev)
1028static void fr_close(struct net_device *dev) 1029static void fr_close(struct net_device *dev)
1029{ 1030{
1030 hdlc_device *hdlc = dev_to_hdlc(dev); 1031 hdlc_device *hdlc = dev_to_hdlc(dev);
1031 pvc_device *pvc = state(hdlc)->first_pvc; 1032 struct pvc_device *pvc = state(hdlc)->first_pvc;
1032 1033
1033 while (pvc) { /* Shutdown all PVCs for this FRAD */ 1034 while (pvc) { /* Shutdown all PVCs for this FRAD */
1034 if (pvc->main) 1035 if (pvc->main)
@@ -1060,7 +1061,7 @@ static const struct net_device_ops pvc_ops = {
1060static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type) 1061static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
1061{ 1062{
1062 hdlc_device *hdlc = dev_to_hdlc(frad); 1063 hdlc_device *hdlc = dev_to_hdlc(frad);
1063 pvc_device *pvc; 1064 struct pvc_device *pvc;
1064 struct net_device *dev; 1065 struct net_device *dev;
1065 int used; 1066 int used;
1066 1067
@@ -1117,7 +1118,7 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)
1117 1118
1118static int fr_del_pvc(hdlc_device *hdlc, unsigned int dlci, int type) 1119static int fr_del_pvc(hdlc_device *hdlc, unsigned int dlci, int type)
1119{ 1120{
1120 pvc_device *pvc; 1121 struct pvc_device *pvc;
1121 struct net_device *dev; 1122 struct net_device *dev;
1122 1123
1123 if ((pvc = find_pvc(hdlc, dlci)) == NULL) 1124 if ((pvc = find_pvc(hdlc, dlci)) == NULL)
@@ -1145,13 +1146,13 @@ static int fr_del_pvc(hdlc_device *hdlc, unsigned int dlci, int type)
1145static void fr_destroy(struct net_device *frad) 1146static void fr_destroy(struct net_device *frad)
1146{ 1147{
1147 hdlc_device *hdlc = dev_to_hdlc(frad); 1148 hdlc_device *hdlc = dev_to_hdlc(frad);
1148 pvc_device *pvc = state(hdlc)->first_pvc; 1149 struct pvc_device *pvc = state(hdlc)->first_pvc;
1149 state(hdlc)->first_pvc = NULL; /* All PVCs destroyed */ 1150 state(hdlc)->first_pvc = NULL; /* All PVCs destroyed */
1150 state(hdlc)->dce_pvc_count = 0; 1151 state(hdlc)->dce_pvc_count = 0;
1151 state(hdlc)->dce_changed = 1; 1152 state(hdlc)->dce_changed = 1;
1152 1153
1153 while (pvc) { 1154 while (pvc) {
1154 pvc_device *next = pvc->next; 1155 struct pvc_device *next = pvc->next;
1155 /* destructors will free_netdev() main and ether */ 1156 /* destructors will free_netdev() main and ether */
1156 if (pvc->main) 1157 if (pvc->main)
1157 unregister_netdevice(pvc->main); 1158 unregister_netdevice(pvc->main);
diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c
index f76aa9081585..1287c3eb33c2 100644
--- a/drivers/net/wan/wanxl.c
+++ b/drivers/net/wan/wanxl.c
@@ -54,24 +54,24 @@ static const char* version = "wanXL serial card driver version: 0.48";
54#define MBX2_MEMSZ_MASK 0xFFFF0000 /* PUTS Memory Size Register mask */ 54#define MBX2_MEMSZ_MASK 0xFFFF0000 /* PUTS Memory Size Register mask */
55 55
56 56
57typedef struct { 57struct port {
58 struct net_device *dev; 58 struct net_device *dev;
59 struct card_t *card; 59 struct card *card;
60 spinlock_t lock; /* for wanxl_xmit */ 60 spinlock_t lock; /* for wanxl_xmit */
61 int node; /* physical port #0 - 3 */ 61 int node; /* physical port #0 - 3 */
62 unsigned int clock_type; 62 unsigned int clock_type;
63 int tx_in, tx_out; 63 int tx_in, tx_out;
64 struct sk_buff *tx_skbs[TX_BUFFERS]; 64 struct sk_buff *tx_skbs[TX_BUFFERS];
65}port_t; 65};
66 66
67 67
68typedef struct { 68struct card_status {
69 desc_t rx_descs[RX_QUEUE_LENGTH]; 69 desc_t rx_descs[RX_QUEUE_LENGTH];
70 port_status_t port_status[4]; 70 port_status_t port_status[4];
71}card_status_t; 71};
72 72
73 73
74typedef struct card_t { 74struct card {
75 int n_ports; /* 1, 2 or 4 ports */ 75 int n_ports; /* 1, 2 or 4 ports */
76 u8 irq; 76 u8 irq;
77 77
@@ -79,20 +79,20 @@ typedef struct card_t {
79 struct pci_dev *pdev; /* for pci_name(pdev) */ 79 struct pci_dev *pdev; /* for pci_name(pdev) */
80 int rx_in; 80 int rx_in;
81 struct sk_buff *rx_skbs[RX_QUEUE_LENGTH]; 81 struct sk_buff *rx_skbs[RX_QUEUE_LENGTH];
82 card_status_t *status; /* shared between host and card */ 82 struct card_status *status; /* shared between host and card */
83 dma_addr_t status_address; 83 dma_addr_t status_address;
84 port_t ports[0]; /* 1 - 4 port_t structures follow */ 84 struct port ports[0]; /* 1 - 4 port structures follow */
85}card_t; 85};
86 86
87 87
88 88
89static inline port_t* dev_to_port(struct net_device *dev) 89static inline struct port *dev_to_port(struct net_device *dev)
90{ 90{
91 return (port_t *)dev_to_hdlc(dev)->priv; 91 return (struct port *)dev_to_hdlc(dev)->priv;
92} 92}
93 93
94 94
95static inline port_status_t* get_status(port_t *port) 95static inline port_status_t *get_status(struct port *port)
96{ 96{
97 return &port->card->status->port_status[port->node]; 97 return &port->card->status->port_status[port->node];
98} 98}
@@ -115,7 +115,7 @@ static inline dma_addr_t pci_map_single_debug(struct pci_dev *pdev, void *ptr,
115 115
116 116
117/* Cable and/or personality module change interrupt service */ 117/* Cable and/or personality module change interrupt service */
118static inline void wanxl_cable_intr(port_t *port) 118static inline void wanxl_cable_intr(struct port *port)
119{ 119{
120 u32 value = get_status(port)->cable; 120 u32 value = get_status(port)->cable;
121 int valid = 1; 121 int valid = 1;
@@ -160,7 +160,7 @@ static inline void wanxl_cable_intr(port_t *port)
160 160
161 161
162/* Transmit complete interrupt service */ 162/* Transmit complete interrupt service */
163static inline void wanxl_tx_intr(port_t *port) 163static inline void wanxl_tx_intr(struct port *port)
164{ 164{
165 struct net_device *dev = port->dev; 165 struct net_device *dev = port->dev;
166 while (1) { 166 while (1) {
@@ -193,7 +193,7 @@ static inline void wanxl_tx_intr(port_t *port)
193 193
194 194
195/* Receive complete interrupt service */ 195/* Receive complete interrupt service */
196static inline void wanxl_rx_intr(card_t *card) 196static inline void wanxl_rx_intr(struct card *card)
197{ 197{
198 desc_t *desc; 198 desc_t *desc;
199 while (desc = &card->status->rx_descs[card->rx_in], 199 while (desc = &card->status->rx_descs[card->rx_in],
@@ -203,7 +203,7 @@ static inline void wanxl_rx_intr(card_t *card)
203 pci_name(card->pdev)); 203 pci_name(card->pdev));
204 else { 204 else {
205 struct sk_buff *skb = card->rx_skbs[card->rx_in]; 205 struct sk_buff *skb = card->rx_skbs[card->rx_in];
206 port_t *port = &card->ports[desc->stat & 206 struct port *port = &card->ports[desc->stat &
207 PACKET_PORT_MASK]; 207 PACKET_PORT_MASK];
208 struct net_device *dev = port->dev; 208 struct net_device *dev = port->dev;
209 209
@@ -245,7 +245,7 @@ static inline void wanxl_rx_intr(card_t *card)
245 245
246static irqreturn_t wanxl_intr(int irq, void* dev_id) 246static irqreturn_t wanxl_intr(int irq, void* dev_id)
247{ 247{
248 card_t *card = dev_id; 248 struct card *card = dev_id;
249 int i; 249 int i;
250 u32 stat; 250 u32 stat;
251 int handled = 0; 251 int handled = 0;
@@ -272,7 +272,7 @@ static irqreturn_t wanxl_intr(int irq, void* dev_id)
272 272
273static netdev_tx_t wanxl_xmit(struct sk_buff *skb, struct net_device *dev) 273static netdev_tx_t wanxl_xmit(struct sk_buff *skb, struct net_device *dev)
274{ 274{
275 port_t *port = dev_to_port(dev); 275 struct port *port = dev_to_port(dev);
276 desc_t *desc; 276 desc_t *desc;
277 277
278 spin_lock(&port->lock); 278 spin_lock(&port->lock);
@@ -319,7 +319,7 @@ static netdev_tx_t wanxl_xmit(struct sk_buff *skb, struct net_device *dev)
319static int wanxl_attach(struct net_device *dev, unsigned short encoding, 319static int wanxl_attach(struct net_device *dev, unsigned short encoding,
320 unsigned short parity) 320 unsigned short parity)
321{ 321{
322 port_t *port = dev_to_port(dev); 322 struct port *port = dev_to_port(dev);
323 323
324 if (encoding != ENCODING_NRZ && 324 if (encoding != ENCODING_NRZ &&
325 encoding != ENCODING_NRZI) 325 encoding != ENCODING_NRZI)
@@ -343,7 +343,7 @@ static int wanxl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
343{ 343{
344 const size_t size = sizeof(sync_serial_settings); 344 const size_t size = sizeof(sync_serial_settings);
345 sync_serial_settings line; 345 sync_serial_settings line;
346 port_t *port = dev_to_port(dev); 346 struct port *port = dev_to_port(dev);
347 347
348 if (cmd != SIOCWANDEV) 348 if (cmd != SIOCWANDEV)
349 return hdlc_ioctl(dev, ifr, cmd); 349 return hdlc_ioctl(dev, ifr, cmd);
@@ -393,7 +393,7 @@ static int wanxl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
393 393
394static int wanxl_open(struct net_device *dev) 394static int wanxl_open(struct net_device *dev)
395{ 395{
396 port_t *port = dev_to_port(dev); 396 struct port *port = dev_to_port(dev);
397 u8 __iomem *dbr = port->card->plx + PLX_DOORBELL_TO_CARD; 397 u8 __iomem *dbr = port->card->plx + PLX_DOORBELL_TO_CARD;
398 unsigned long timeout; 398 unsigned long timeout;
399 int i; 399 int i;
@@ -429,7 +429,7 @@ static int wanxl_open(struct net_device *dev)
429 429
430static int wanxl_close(struct net_device *dev) 430static int wanxl_close(struct net_device *dev)
431{ 431{
432 port_t *port = dev_to_port(dev); 432 struct port *port = dev_to_port(dev);
433 unsigned long timeout; 433 unsigned long timeout;
434 int i; 434 int i;
435 435
@@ -467,7 +467,7 @@ static int wanxl_close(struct net_device *dev)
467 467
468static struct net_device_stats *wanxl_get_stats(struct net_device *dev) 468static struct net_device_stats *wanxl_get_stats(struct net_device *dev)
469{ 469{
470 port_t *port = dev_to_port(dev); 470 struct port *port = dev_to_port(dev);
471 471
472 dev->stats.rx_over_errors = get_status(port)->rx_overruns; 472 dev->stats.rx_over_errors = get_status(port)->rx_overruns;
473 dev->stats.rx_frame_errors = get_status(port)->rx_frame_errors; 473 dev->stats.rx_frame_errors = get_status(port)->rx_frame_errors;
@@ -478,7 +478,7 @@ static struct net_device_stats *wanxl_get_stats(struct net_device *dev)
478 478
479 479
480 480
481static int wanxl_puts_command(card_t *card, u32 cmd) 481static int wanxl_puts_command(struct card *card, u32 cmd)
482{ 482{
483 unsigned long timeout = jiffies + 5 * HZ; 483 unsigned long timeout = jiffies + 5 * HZ;
484 484
@@ -495,7 +495,7 @@ static int wanxl_puts_command(card_t *card, u32 cmd)
495 495
496 496
497 497
498static void wanxl_reset(card_t *card) 498static void wanxl_reset(struct card *card)
499{ 499{
500 u32 old_value = readl(card->plx + PLX_CONTROL) & ~PLX_CTL_RESET; 500 u32 old_value = readl(card->plx + PLX_CONTROL) & ~PLX_CTL_RESET;
501 501
@@ -511,7 +511,7 @@ static void wanxl_reset(card_t *card)
511 511
512static void wanxl_pci_remove_one(struct pci_dev *pdev) 512static void wanxl_pci_remove_one(struct pci_dev *pdev)
513{ 513{
514 card_t *card = pci_get_drvdata(pdev); 514 struct card *card = pci_get_drvdata(pdev);
515 int i; 515 int i;
516 516
517 for (i = 0; i < card->n_ports; i++) { 517 for (i = 0; i < card->n_ports; i++) {
@@ -537,7 +537,7 @@ static void wanxl_pci_remove_one(struct pci_dev *pdev)
537 iounmap(card->plx); 537 iounmap(card->plx);
538 538
539 if (card->status) 539 if (card->status)
540 pci_free_consistent(pdev, sizeof(card_status_t), 540 pci_free_consistent(pdev, sizeof(struct card_status),
541 card->status, card->status_address); 541 card->status, card->status_address);
542 542
543 pci_release_regions(pdev); 543 pci_release_regions(pdev);
@@ -560,7 +560,7 @@ static const struct net_device_ops wanxl_ops = {
560static int wanxl_pci_init_one(struct pci_dev *pdev, 560static int wanxl_pci_init_one(struct pci_dev *pdev,
561 const struct pci_device_id *ent) 561 const struct pci_device_id *ent)
562{ 562{
563 card_t *card; 563 struct card *card;
564 u32 ramsize, stat; 564 u32 ramsize, stat;
565 unsigned long timeout; 565 unsigned long timeout;
566 u32 plx_phy; /* PLX PCI base address */ 566 u32 plx_phy; /* PLX PCI base address */
@@ -601,7 +601,7 @@ static int wanxl_pci_init_one(struct pci_dev *pdev,
601 default: ports = 4; 601 default: ports = 4;
602 } 602 }
603 603
604 alloc_size = sizeof(card_t) + ports * sizeof(port_t); 604 alloc_size = sizeof(struct card) + ports * sizeof(struct port);
605 card = kzalloc(alloc_size, GFP_KERNEL); 605 card = kzalloc(alloc_size, GFP_KERNEL);
606 if (card == NULL) { 606 if (card == NULL) {
607 pci_release_regions(pdev); 607 pci_release_regions(pdev);
@@ -612,7 +612,8 @@ static int wanxl_pci_init_one(struct pci_dev *pdev,
612 pci_set_drvdata(pdev, card); 612 pci_set_drvdata(pdev, card);
613 card->pdev = pdev; 613 card->pdev = pdev;
614 614
615 card->status = pci_alloc_consistent(pdev, sizeof(card_status_t), 615 card->status = pci_alloc_consistent(pdev,
616 sizeof(struct card_status),
616 &card->status_address); 617 &card->status_address);
617 if (card->status == NULL) { 618 if (card->status == NULL) {
618 wanxl_pci_remove_one(pdev); 619 wanxl_pci_remove_one(pdev);
@@ -766,7 +767,7 @@ static int wanxl_pci_init_one(struct pci_dev *pdev,
766 767
767 for (i = 0; i < ports; i++) { 768 for (i = 0; i < ports; i++) {
768 hdlc_device *hdlc; 769 hdlc_device *hdlc;
769 port_t *port = &card->ports[i]; 770 struct port *port = &card->ports[i];
770 struct net_device *dev = alloc_hdlcdev(port); 771 struct net_device *dev = alloc_hdlcdev(port);
771 if (!dev) { 772 if (!dev) {
772 pr_err("%s: unable to allocate memory\n", 773 pr_err("%s: unable to allocate memory\n",
diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c
index 7e9ede6c5798..d9ed22b4cc6b 100644
--- a/drivers/net/wireless/airo_cs.c
+++ b/drivers/net/wireless/airo_cs.c
@@ -56,18 +56,18 @@ static void airo_release(struct pcmcia_device *link);
56 56
57static void airo_detach(struct pcmcia_device *p_dev); 57static void airo_detach(struct pcmcia_device *p_dev);
58 58
59typedef struct local_info_t { 59struct local_info {
60 struct net_device *eth_dev; 60 struct net_device *eth_dev;
61} local_info_t; 61};
62 62
63static int airo_probe(struct pcmcia_device *p_dev) 63static int airo_probe(struct pcmcia_device *p_dev)
64{ 64{
65 local_info_t *local; 65 struct local_info *local;
66 66
67 dev_dbg(&p_dev->dev, "airo_attach()\n"); 67 dev_dbg(&p_dev->dev, "airo_attach()\n");
68 68
69 /* Allocate space for private device-specific data */ 69 /* Allocate space for private device-specific data */
70 local = kzalloc(sizeof(local_info_t), GFP_KERNEL); 70 local = kzalloc(sizeof(*local), GFP_KERNEL);
71 if (!local) 71 if (!local)
72 return -ENOMEM; 72 return -ENOMEM;
73 73
@@ -82,10 +82,11 @@ static void airo_detach(struct pcmcia_device *link)
82 82
83 airo_release(link); 83 airo_release(link);
84 84
85 if (((local_info_t *)link->priv)->eth_dev) { 85 if (((struct local_info *)link->priv)->eth_dev) {
86 stop_airo_card(((local_info_t *)link->priv)->eth_dev, 0); 86 stop_airo_card(((struct local_info *)link->priv)->eth_dev,
87 0);
87 } 88 }
88 ((local_info_t *)link->priv)->eth_dev = NULL; 89 ((struct local_info *)link->priv)->eth_dev = NULL;
89 90
90 kfree(link->priv); 91 kfree(link->priv);
91} /* airo_detach */ 92} /* airo_detach */
@@ -101,7 +102,7 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev, void *priv_data)
101 102
102static int airo_config(struct pcmcia_device *link) 103static int airo_config(struct pcmcia_device *link)
103{ 104{
104 local_info_t *dev; 105 struct local_info *dev;
105 int ret; 106 int ret;
106 107
107 dev = link->priv; 108 dev = link->priv;
@@ -121,10 +122,10 @@ static int airo_config(struct pcmcia_device *link)
121 ret = pcmcia_enable_device(link); 122 ret = pcmcia_enable_device(link);
122 if (ret) 123 if (ret)
123 goto failed; 124 goto failed;
124 ((local_info_t *)link->priv)->eth_dev = 125 ((struct local_info *)link->priv)->eth_dev =
125 init_airo_card(link->irq, 126 init_airo_card(link->irq,
126 link->resource[0]->start, 1, &link->dev); 127 link->resource[0]->start, 1, &link->dev);
127 if (!((local_info_t *)link->priv)->eth_dev) 128 if (!((struct local_info *)link->priv)->eth_dev)
128 goto failed; 129 goto failed;
129 130
130 return 0; 131 return 0;
@@ -142,7 +143,7 @@ static void airo_release(struct pcmcia_device *link)
142 143
143static int airo_suspend(struct pcmcia_device *link) 144static int airo_suspend(struct pcmcia_device *link)
144{ 145{
145 local_info_t *local = link->priv; 146 struct local_info *local = link->priv;
146 147
147 netif_device_detach(local->eth_dev); 148 netif_device_detach(local->eth_dev);
148 149
@@ -151,7 +152,7 @@ static int airo_suspend(struct pcmcia_device *link)
151 152
152static int airo_resume(struct pcmcia_device *link) 153static int airo_resume(struct pcmcia_device *link)
153{ 154{
154 local_info_t *local = link->priv; 155 struct local_info *local = link->priv;
155 156
156 if (link->open) { 157 if (link->open) {
157 reset_airo_card(local->eth_dev); 158 reset_airo_card(local->eth_dev);
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c
index 1fe41af81a59..9183f1cf89a7 100644
--- a/drivers/net/wireless/atmel.c
+++ b/drivers/net/wireless/atmel.c
@@ -2598,11 +2598,11 @@ static const iw_handler atmel_private_handler[] =
2598 NULL, /* SIOCIWFIRSTPRIV */ 2598 NULL, /* SIOCIWFIRSTPRIV */
2599}; 2599};
2600 2600
2601typedef struct atmel_priv_ioctl { 2601struct atmel_priv_ioctl {
2602 char id[32]; 2602 char id[32];
2603 unsigned char __user *data; 2603 unsigned char __user *data;
2604 unsigned short len; 2604 unsigned short len;
2605} atmel_priv_ioctl; 2605};
2606 2606
2607#define ATMELFWL SIOCIWFIRSTPRIV 2607#define ATMELFWL SIOCIWFIRSTPRIV
2608#define ATMELIDIFC ATMELFWL + 1 2608#define ATMELIDIFC ATMELFWL + 1
@@ -2615,7 +2615,7 @@ static const struct iw_priv_args atmel_private_args[] = {
2615 .cmd = ATMELFWL, 2615 .cmd = ATMELFWL,
2616 .set_args = IW_PRIV_TYPE_BYTE 2616 .set_args = IW_PRIV_TYPE_BYTE
2617 | IW_PRIV_SIZE_FIXED 2617 | IW_PRIV_SIZE_FIXED
2618 | sizeof (atmel_priv_ioctl), 2618 | sizeof(struct atmel_priv_ioctl),
2619 .get_args = IW_PRIV_TYPE_NONE, 2619 .get_args = IW_PRIV_TYPE_NONE,
2620 .name = "atmelfwl" 2620 .name = "atmelfwl"
2621 }, { 2621 }, {
@@ -2645,7 +2645,7 @@ static int atmel_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
2645{ 2645{
2646 int i, rc = 0; 2646 int i, rc = 0;
2647 struct atmel_private *priv = netdev_priv(dev); 2647 struct atmel_private *priv = netdev_priv(dev);
2648 atmel_priv_ioctl com; 2648 struct atmel_priv_ioctl com;
2649 struct iwreq *wrq = (struct iwreq *) rq; 2649 struct iwreq *wrq = (struct iwreq *) rq;
2650 unsigned char *new_firmware; 2650 unsigned char *new_firmware;
2651 char domain[REGDOMAINSZ + 1]; 2651 char domain[REGDOMAINSZ + 1];
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 48a55cda979b..bfd10cb9c8de 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -78,12 +78,8 @@ int xenvif_poll(struct napi_struct *napi, int budget)
78 /* This vif is rogue, we pretend we've there is nothing to do 78 /* This vif is rogue, we pretend we've there is nothing to do
79 * for this vif to deschedule it from NAPI. But this interface 79 * for this vif to deschedule it from NAPI. But this interface
80 * will be turned off in thread context later. 80 * will be turned off in thread context later.
81 * Also, if a guest doesn't post enough slots to receive data on one of
82 * its queues, the carrier goes down and NAPI is descheduled here so
83 * the guest can't send more packets until it's ready to receive.
84 */ 81 */
85 if (unlikely(queue->vif->disabled || 82 if (unlikely(queue->vif->disabled)) {
86 !netif_carrier_ok(queue->vif->dev))) {
87 napi_complete(napi); 83 napi_complete(napi);
88 return 0; 84 return 0;
89 } 85 }
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index aa2093325be1..4734472aa620 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -2025,9 +2025,15 @@ int xenvif_kthread_guest_rx(void *data)
2025 * context so we defer it here, if this thread is 2025 * context so we defer it here, if this thread is
2026 * associated with queue 0. 2026 * associated with queue 0.
2027 */ 2027 */
2028 if (unlikely(queue->vif->disabled && queue->id == 0)) 2028 if (unlikely(queue->vif->disabled && queue->id == 0)) {
2029 xenvif_carrier_off(queue->vif); 2029 xenvif_carrier_off(queue->vif);
2030 else if (unlikely(test_and_clear_bit(QUEUE_STATUS_RX_PURGE_EVENT, 2030 } else if (unlikely(queue->vif->disabled)) {
2031 /* kthread_stop() would be called upon this thread soon,
2032 * be a bit proactive
2033 */
2034 skb_queue_purge(&queue->rx_queue);
2035 queue->rx_last_skb_slots = 0;
2036 } else if (unlikely(test_and_clear_bit(QUEUE_STATUS_RX_PURGE_EVENT,
2031 &queue->status))) { 2037 &queue->status))) {
2032 xenvif_rx_purge_event(queue); 2038 xenvif_rx_purge_event(queue);
2033 } else if (!netif_carrier_ok(queue->vif->dev)) { 2039 } else if (!netif_carrier_ok(queue->vif->dev)) {
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 28204bc4f369..ca82f545ec2c 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -628,9 +628,10 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
628 slots = DIV_ROUND_UP(offset + len, PAGE_SIZE) + 628 slots = DIV_ROUND_UP(offset + len, PAGE_SIZE) +
629 xennet_count_skb_frag_slots(skb); 629 xennet_count_skb_frag_slots(skb);
630 if (unlikely(slots > MAX_SKB_FRAGS + 1)) { 630 if (unlikely(slots > MAX_SKB_FRAGS + 1)) {
631 net_alert_ratelimited( 631 net_dbg_ratelimited("xennet: skb rides the rocket: %d slots, %d bytes\n",
632 "xennet: skb rides the rocket: %d slots\n", slots); 632 slots, skb->len);
633 goto drop; 633 if (skb_linearize(skb))
634 goto drop;
634 } 635 }
635 636
636 spin_lock_irqsave(&queue->tx_lock, flags); 637 spin_lock_irqsave(&queue->tx_lock, flags);
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 4967916fe4ac..d69f0577a319 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h
@@ -187,7 +187,6 @@ vlan_dev_get_egress_qos_mask(struct net_device *dev, u32 skprio)
187} 187}
188 188
189extern bool vlan_do_receive(struct sk_buff **skb); 189extern bool vlan_do_receive(struct sk_buff **skb);
190extern struct sk_buff *vlan_untag(struct sk_buff *skb);
191 190
192extern int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid); 191extern int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid);
193extern void vlan_vid_del(struct net_device *dev, __be16 proto, u16 vid); 192extern void vlan_vid_del(struct net_device *dev, __be16 proto, u16 vid);
@@ -241,11 +240,6 @@ static inline bool vlan_do_receive(struct sk_buff **skb)
241 return false; 240 return false;
242} 241}
243 242
244static inline struct sk_buff *vlan_untag(struct sk_buff *skb)
245{
246 return skb;
247}
248
249static inline int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid) 243static inline int vlan_vid_add(struct net_device *dev, __be16 proto, u16 vid)
250{ 244{
251 return 0; 245 return 0;
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 11c270551d25..abde271c18ae 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2555,6 +2555,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen);
2555void skb_scrub_packet(struct sk_buff *skb, bool xnet); 2555void skb_scrub_packet(struct sk_buff *skb, bool xnet);
2556unsigned int skb_gso_transport_seglen(const struct sk_buff *skb); 2556unsigned int skb_gso_transport_seglen(const struct sk_buff *skb);
2557struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features); 2557struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features);
2558struct sk_buff *skb_vlan_untag(struct sk_buff *skb);
2558 2559
2559struct skb_checksum_ops { 2560struct skb_checksum_ops {
2560 __wsum (*update)(const void *mem, int len, __wsum wsum); 2561 __wsum (*update)(const void *mem, int len, __wsum wsum);
diff --git a/net/6lowpan/Kconfig b/net/6lowpan/Kconfig
index 028a5c6d1f61..e4a02ef55102 100644
--- a/net/6lowpan/Kconfig
+++ b/net/6lowpan/Kconfig
@@ -1,5 +1,5 @@
1config 6LOWPAN 1config 6LOWPAN
2 bool "6LoWPAN Support" 2 tristate "6LoWPAN Support"
3 depends on IPV6 3 depends on IPV6
4 ---help--- 4 ---help---
5 This enables IPv6 over Low power Wireless Personal Area Network - 5 This enables IPv6 over Low power Wireless Personal Area Network -
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
index 75d427763992..90cc2bdd4064 100644
--- a/net/8021q/vlan_core.c
+++ b/net/8021q/vlan_core.c
@@ -112,59 +112,6 @@ __be16 vlan_dev_vlan_proto(const struct net_device *dev)
112} 112}
113EXPORT_SYMBOL(vlan_dev_vlan_proto); 113EXPORT_SYMBOL(vlan_dev_vlan_proto);
114 114
115static struct sk_buff *vlan_reorder_header(struct sk_buff *skb)
116{
117 if (skb_cow(skb, skb_headroom(skb)) < 0) {
118 kfree_skb(skb);
119 return NULL;
120 }
121
122 memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN);
123 skb->mac_header += VLAN_HLEN;
124 return skb;
125}
126
127struct sk_buff *vlan_untag(struct sk_buff *skb)
128{
129 struct vlan_hdr *vhdr;
130 u16 vlan_tci;
131
132 if (unlikely(vlan_tx_tag_present(skb))) {
133 /* vlan_tci is already set-up so leave this for another time */
134 return skb;
135 }
136
137 skb = skb_share_check(skb, GFP_ATOMIC);
138 if (unlikely(!skb))
139 goto err_free;
140
141 if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
142 goto err_free;
143
144 vhdr = (struct vlan_hdr *) skb->data;
145 vlan_tci = ntohs(vhdr->h_vlan_TCI);
146 __vlan_hwaccel_put_tag(skb, skb->protocol, vlan_tci);
147
148 skb_pull_rcsum(skb, VLAN_HLEN);
149 vlan_set_encap_proto(skb, vhdr);
150
151 skb = vlan_reorder_header(skb);
152 if (unlikely(!skb))
153 goto err_free;
154
155 skb_reset_network_header(skb);
156 skb_reset_transport_header(skb);
157 skb_reset_mac_len(skb);
158
159 return skb;
160
161err_free:
162 kfree_skb(skb);
163 return NULL;
164}
165EXPORT_SYMBOL(vlan_untag);
166
167
168/* 115/*
169 * vlan info and vid list 116 * vlan info and vid list
170 */ 117 */
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
index 96b66fd30f96..ab6bb2af1d45 100644
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@ -20,7 +20,6 @@
20#include "originator.h" 20#include "originator.h"
21#include "hard-interface.h" 21#include "hard-interface.h"
22#include "translation-table.h" 22#include "translation-table.h"
23#include "multicast.h"
24 23
25/** 24/**
26 * batadv_mcast_mla_softif_get - get softif multicast listeners 25 * batadv_mcast_mla_softif_get - get softif multicast listeners
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
index febb0f87fa37..e1bcd653899b 100644
--- a/net/bridge/br_vlan.c
+++ b/net/bridge/br_vlan.c
@@ -181,7 +181,7 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
181 */ 181 */
182 if (unlikely(!vlan_tx_tag_present(skb) && 182 if (unlikely(!vlan_tx_tag_present(skb) &&
183 skb->protocol == proto)) { 183 skb->protocol == proto)) {
184 skb = vlan_untag(skb); 184 skb = skb_vlan_untag(skb);
185 if (unlikely(!skb)) 185 if (unlikely(!skb))
186 return false; 186 return false;
187 } 187 }
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 1059ed3bc255..6d69631b9f4d 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -327,10 +327,7 @@ find_inlist_lock_noload(struct list_head *head, const char *name, int *error,
327 char name[EBT_FUNCTION_MAXNAMELEN]; 327 char name[EBT_FUNCTION_MAXNAMELEN];
328 } *e; 328 } *e;
329 329
330 *error = mutex_lock_interruptible(mutex); 330 mutex_lock(mutex);
331 if (*error != 0)
332 return NULL;
333
334 list_for_each_entry(e, head, list) { 331 list_for_each_entry(e, head, list) {
335 if (strcmp(e->name, name) == 0) 332 if (strcmp(e->name, name) == 0)
336 return e; 333 return e;
@@ -1203,10 +1200,7 @@ ebt_register_table(struct net *net, const struct ebt_table *input_table)
1203 1200
1204 table->private = newinfo; 1201 table->private = newinfo;
1205 rwlock_init(&table->lock); 1202 rwlock_init(&table->lock);
1206 ret = mutex_lock_interruptible(&ebt_mutex); 1203 mutex_lock(&ebt_mutex);
1207 if (ret != 0)
1208 goto free_chainstack;
1209
1210 list_for_each_entry(t, &net->xt.tables[NFPROTO_BRIDGE], list) { 1204 list_for_each_entry(t, &net->xt.tables[NFPROTO_BRIDGE], list) {
1211 if (strcmp(t->name, table->name) == 0) { 1205 if (strcmp(t->name, table->name) == 0) {
1212 ret = -EEXIST; 1206 ret = -EEXIST;
diff --git a/net/core/dev.c b/net/core/dev.c
index 1c15b189c52b..b65a5051361f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3602,7 +3602,7 @@ another_round:
3602 3602
3603 if (skb->protocol == cpu_to_be16(ETH_P_8021Q) || 3603 if (skb->protocol == cpu_to_be16(ETH_P_8021Q) ||
3604 skb->protocol == cpu_to_be16(ETH_P_8021AD)) { 3604 skb->protocol == cpu_to_be16(ETH_P_8021AD)) {
3605 skb = vlan_untag(skb); 3605 skb = skb_vlan_untag(skb);
3606 if (unlikely(!skb)) 3606 if (unlikely(!skb))
3607 goto unlock; 3607 goto unlock;
3608 } 3608 }
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 8d39071f32d7..f0493e3b7471 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -804,7 +804,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev,
804 (nla_total_size(sizeof(struct ifla_vf_mac)) + 804 (nla_total_size(sizeof(struct ifla_vf_mac)) +
805 nla_total_size(sizeof(struct ifla_vf_vlan)) + 805 nla_total_size(sizeof(struct ifla_vf_vlan)) +
806 nla_total_size(sizeof(struct ifla_vf_spoofchk)) + 806 nla_total_size(sizeof(struct ifla_vf_spoofchk)) +
807 nla_total_size(sizeof(struct ifla_vf_rate))); 807 nla_total_size(sizeof(struct ifla_vf_rate)) +
808 nla_total_size(sizeof(struct ifla_vf_link_state)));
808 return size; 809 return size;
809 } else 810 } else
810 return 0; 811 return 0;
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 224506a6fa80..163b673f9e62 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -62,6 +62,7 @@
62#include <linux/scatterlist.h> 62#include <linux/scatterlist.h>
63#include <linux/errqueue.h> 63#include <linux/errqueue.h>
64#include <linux/prefetch.h> 64#include <linux/prefetch.h>
65#include <linux/if_vlan.h>
65 66
66#include <net/protocol.h> 67#include <net/protocol.h>
67#include <net/dst.h> 68#include <net/dst.h>
@@ -3973,3 +3974,55 @@ unsigned int skb_gso_transport_seglen(const struct sk_buff *skb)
3973 return shinfo->gso_size; 3974 return shinfo->gso_size;
3974} 3975}
3975EXPORT_SYMBOL_GPL(skb_gso_transport_seglen); 3976EXPORT_SYMBOL_GPL(skb_gso_transport_seglen);
3977
3978static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb)
3979{
3980 if (skb_cow(skb, skb_headroom(skb)) < 0) {
3981 kfree_skb(skb);
3982 return NULL;
3983 }
3984
3985 memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN);
3986 skb->mac_header += VLAN_HLEN;
3987 return skb;
3988}
3989
3990struct sk_buff *skb_vlan_untag(struct sk_buff *skb)
3991{
3992 struct vlan_hdr *vhdr;
3993 u16 vlan_tci;
3994
3995 if (unlikely(vlan_tx_tag_present(skb))) {
3996 /* vlan_tci is already set-up so leave this for another time */
3997 return skb;
3998 }
3999
4000 skb = skb_share_check(skb, GFP_ATOMIC);
4001 if (unlikely(!skb))
4002 goto err_free;
4003
4004 if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
4005 goto err_free;
4006
4007 vhdr = (struct vlan_hdr *)skb->data;
4008 vlan_tci = ntohs(vhdr->h_vlan_TCI);
4009 __vlan_hwaccel_put_tag(skb, skb->protocol, vlan_tci);
4010
4011 skb_pull_rcsum(skb, VLAN_HLEN);
4012 vlan_set_encap_proto(skb, vhdr);
4013
4014 skb = skb_reorder_vlan_header(skb);
4015 if (unlikely(!skb))
4016 goto err_free;
4017
4018 skb_reset_network_header(skb);
4019 skb_reset_transport_header(skb);
4020 skb_reset_mac_len(skb);
4021
4022 return skb;
4023
4024err_free:
4025 kfree_skb(skb);
4026 return NULL;
4027}
4028EXPORT_SYMBOL(skb_vlan_untag);
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 190199851c9a..eaa4b000c7b4 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1798,8 +1798,6 @@ local_input:
1798no_route: 1798no_route:
1799 RT_CACHE_STAT_INC(in_no_route); 1799 RT_CACHE_STAT_INC(in_no_route);
1800 res.type = RTN_UNREACHABLE; 1800 res.type = RTN_UNREACHABLE;
1801 if (err == -ESRCH)
1802 err = -ENETUNREACH;
1803 goto local_input; 1801 goto local_input;
1804 1802
1805 /* 1803 /*
diff --git a/net/netfilter/core.c b/net/netfilter/core.c
index 1fbab0cdd302..a93c97f106d4 100644
--- a/net/netfilter/core.c
+++ b/net/netfilter/core.c
@@ -35,11 +35,7 @@ EXPORT_SYMBOL_GPL(nf_ipv6_ops);
35 35
36int nf_register_afinfo(const struct nf_afinfo *afinfo) 36int nf_register_afinfo(const struct nf_afinfo *afinfo)
37{ 37{
38 int err; 38 mutex_lock(&afinfo_mutex);
39
40 err = mutex_lock_interruptible(&afinfo_mutex);
41 if (err < 0)
42 return err;
43 RCU_INIT_POINTER(nf_afinfo[afinfo->family], afinfo); 39 RCU_INIT_POINTER(nf_afinfo[afinfo->family], afinfo);
44 mutex_unlock(&afinfo_mutex); 40 mutex_unlock(&afinfo_mutex);
45 return 0; 41 return 0;
@@ -68,11 +64,8 @@ static DEFINE_MUTEX(nf_hook_mutex);
68int nf_register_hook(struct nf_hook_ops *reg) 64int nf_register_hook(struct nf_hook_ops *reg)
69{ 65{
70 struct nf_hook_ops *elem; 66 struct nf_hook_ops *elem;
71 int err;
72 67
73 err = mutex_lock_interruptible(&nf_hook_mutex); 68 mutex_lock(&nf_hook_mutex);
74 if (err < 0)
75 return err;
76 list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) { 69 list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {
77 if (reg->priority < elem->priority) 70 if (reg->priority < elem->priority)
78 break; 71 break;
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index 8416307fdd1d..fd3f444a4f96 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -2271,10 +2271,7 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2271 cmd == IP_VS_SO_SET_STOPDAEMON) { 2271 cmd == IP_VS_SO_SET_STOPDAEMON) {
2272 struct ip_vs_daemon_user *dm = (struct ip_vs_daemon_user *)arg; 2272 struct ip_vs_daemon_user *dm = (struct ip_vs_daemon_user *)arg;
2273 2273
2274 if (mutex_lock_interruptible(&ipvs->sync_mutex)) { 2274 mutex_lock(&ipvs->sync_mutex);
2275 ret = -ERESTARTSYS;
2276 goto out_dec;
2277 }
2278 if (cmd == IP_VS_SO_SET_STARTDAEMON) 2275 if (cmd == IP_VS_SO_SET_STARTDAEMON)
2279 ret = start_sync_thread(net, dm->state, dm->mcast_ifn, 2276 ret = start_sync_thread(net, dm->state, dm->mcast_ifn,
2280 dm->syncid); 2277 dm->syncid);
@@ -2284,11 +2281,7 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2284 goto out_dec; 2281 goto out_dec;
2285 } 2282 }
2286 2283
2287 if (mutex_lock_interruptible(&__ip_vs_mutex)) { 2284 mutex_lock(&__ip_vs_mutex);
2288 ret = -ERESTARTSYS;
2289 goto out_dec;
2290 }
2291
2292 if (cmd == IP_VS_SO_SET_FLUSH) { 2285 if (cmd == IP_VS_SO_SET_FLUSH) {
2293 /* Flush the virtual service */ 2286 /* Flush the virtual service */
2294 ret = ip_vs_flush(net, false); 2287 ret = ip_vs_flush(net, false);
@@ -2573,9 +2566,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
2573 struct ip_vs_daemon_user d[2]; 2566 struct ip_vs_daemon_user d[2];
2574 2567
2575 memset(&d, 0, sizeof(d)); 2568 memset(&d, 0, sizeof(d));
2576 if (mutex_lock_interruptible(&ipvs->sync_mutex)) 2569 mutex_lock(&ipvs->sync_mutex);
2577 return -ERESTARTSYS;
2578
2579 if (ipvs->sync_state & IP_VS_STATE_MASTER) { 2570 if (ipvs->sync_state & IP_VS_STATE_MASTER) {
2580 d[0].state = IP_VS_STATE_MASTER; 2571 d[0].state = IP_VS_STATE_MASTER;
2581 strlcpy(d[0].mcast_ifn, ipvs->master_mcast_ifn, 2572 strlcpy(d[0].mcast_ifn, ipvs->master_mcast_ifn,
@@ -2594,9 +2585,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
2594 return ret; 2585 return ret;
2595 } 2586 }
2596 2587
2597 if (mutex_lock_interruptible(&__ip_vs_mutex)) 2588 mutex_lock(&__ip_vs_mutex);
2598 return -ERESTARTSYS;
2599
2600 switch (cmd) { 2589 switch (cmd) {
2601 case IP_VS_SO_GET_VERSION: 2590 case IP_VS_SO_GET_VERSION:
2602 { 2591 {
diff --git a/net/netfilter/nf_sockopt.c b/net/netfilter/nf_sockopt.c
index f042ae521557..c68c1e58b362 100644
--- a/net/netfilter/nf_sockopt.c
+++ b/net/netfilter/nf_sockopt.c
@@ -26,9 +26,7 @@ int nf_register_sockopt(struct nf_sockopt_ops *reg)
26 struct nf_sockopt_ops *ops; 26 struct nf_sockopt_ops *ops;
27 int ret = 0; 27 int ret = 0;
28 28
29 if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) 29 mutex_lock(&nf_sockopt_mutex);
30 return -EINTR;
31
32 list_for_each_entry(ops, &nf_sockopts, list) { 30 list_for_each_entry(ops, &nf_sockopts, list) {
33 if (ops->pf == reg->pf 31 if (ops->pf == reg->pf
34 && (overlap(ops->set_optmin, ops->set_optmax, 32 && (overlap(ops->set_optmin, ops->set_optmax,
@@ -65,9 +63,7 @@ static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, u_int8_t pf,
65{ 63{
66 struct nf_sockopt_ops *ops; 64 struct nf_sockopt_ops *ops;
67 65
68 if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0) 66 mutex_lock(&nf_sockopt_mutex);
69 return ERR_PTR(-EINTR);
70
71 list_for_each_entry(ops, &nf_sockopts, list) { 67 list_for_each_entry(ops, &nf_sockopts, list) {
72 if (ops->pf == pf) { 68 if (ops->pf == pf) {
73 if (!try_module_get(ops->owner)) 69 if (!try_module_get(ops->owner))
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index b8035c2d6667..deeb95fb7028 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -899,6 +899,9 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
899static void nft_chain_stats_replace(struct nft_base_chain *chain, 899static void nft_chain_stats_replace(struct nft_base_chain *chain,
900 struct nft_stats __percpu *newstats) 900 struct nft_stats __percpu *newstats)
901{ 901{
902 if (newstats == NULL)
903 return;
904
902 if (chain->stats) { 905 if (chain->stats) {
903 struct nft_stats __percpu *oldstats = 906 struct nft_stats __percpu *oldstats =
904 nft_dereference(chain->stats); 907 nft_dereference(chain->stats);
@@ -3134,16 +3137,13 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
3134 goto err2; 3137 goto err2;
3135 3138
3136 trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set); 3139 trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
3137 if (trans == NULL) 3140 if (trans == NULL) {
3141 err = -ENOMEM;
3138 goto err2; 3142 goto err2;
3143 }
3139 3144
3140 nft_trans_elem(trans) = elem; 3145 nft_trans_elem(trans) = elem;
3141 list_add_tail(&trans->list, &ctx->net->nft.commit_list); 3146 list_add_tail(&trans->list, &ctx->net->nft.commit_list);
3142
3143 nft_data_uninit(&elem.key, NFT_DATA_VALUE);
3144 if (set->flags & NFT_SET_MAP)
3145 nft_data_uninit(&elem.data, set->dtype);
3146
3147 return 0; 3147 return 0;
3148err2: 3148err2:
3149 nft_data_uninit(&elem.key, desc.type); 3149 nft_data_uninit(&elem.key, desc.type);
@@ -3310,7 +3310,7 @@ static int nf_tables_commit(struct sk_buff *skb)
3310{ 3310{
3311 struct net *net = sock_net(skb->sk); 3311 struct net *net = sock_net(skb->sk);
3312 struct nft_trans *trans, *next; 3312 struct nft_trans *trans, *next;
3313 struct nft_set *set; 3313 struct nft_trans_elem *te;
3314 3314
3315 /* Bump generation counter, invalidate any dump in progress */ 3315 /* Bump generation counter, invalidate any dump in progress */
3316 while (++net->nft.base_seq == 0); 3316 while (++net->nft.base_seq == 0);
@@ -3396,13 +3396,17 @@ static int nf_tables_commit(struct sk_buff *skb)
3396 nft_trans_destroy(trans); 3396 nft_trans_destroy(trans);
3397 break; 3397 break;
3398 case NFT_MSG_DELSETELEM: 3398 case NFT_MSG_DELSETELEM:
3399 nf_tables_setelem_notify(&trans->ctx, 3399 te = (struct nft_trans_elem *)trans->data;
3400 nft_trans_elem_set(trans), 3400 nf_tables_setelem_notify(&trans->ctx, te->set,
3401 &nft_trans_elem(trans), 3401 &te->elem,
3402 NFT_MSG_DELSETELEM, 0); 3402 NFT_MSG_DELSETELEM, 0);
3403 set = nft_trans_elem_set(trans); 3403 te->set->ops->get(te->set, &te->elem);
3404 set->ops->get(set, &nft_trans_elem(trans)); 3404 te->set->ops->remove(te->set, &te->elem);
3405 set->ops->remove(set, &nft_trans_elem(trans)); 3405 nft_data_uninit(&te->elem.key, NFT_DATA_VALUE);
3406 if (te->elem.flags & NFT_SET_MAP) {
3407 nft_data_uninit(&te->elem.data,
3408 te->set->dtype);
3409 }
3406 nft_trans_destroy(trans); 3410 nft_trans_destroy(trans);
3407 break; 3411 break;
3408 } 3412 }
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 47b978bc3100..272ae4d6fdf4 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -71,18 +71,14 @@ static const char *const xt_prefix[NFPROTO_NUMPROTO] = {
71static const unsigned int xt_jumpstack_multiplier = 2; 71static const unsigned int xt_jumpstack_multiplier = 2;
72 72
73/* Registration hooks for targets. */ 73/* Registration hooks for targets. */
74int 74int xt_register_target(struct xt_target *target)
75xt_register_target(struct xt_target *target)
76{ 75{
77 u_int8_t af = target->family; 76 u_int8_t af = target->family;
78 int ret;
79 77
80 ret = mutex_lock_interruptible(&xt[af].mutex); 78 mutex_lock(&xt[af].mutex);
81 if (ret != 0)
82 return ret;
83 list_add(&target->list, &xt[af].target); 79 list_add(&target->list, &xt[af].target);
84 mutex_unlock(&xt[af].mutex); 80 mutex_unlock(&xt[af].mutex);
85 return ret; 81 return 0;
86} 82}
87EXPORT_SYMBOL(xt_register_target); 83EXPORT_SYMBOL(xt_register_target);
88 84
@@ -125,20 +121,14 @@ xt_unregister_targets(struct xt_target *target, unsigned int n)
125} 121}
126EXPORT_SYMBOL(xt_unregister_targets); 122EXPORT_SYMBOL(xt_unregister_targets);
127 123
128int 124int xt_register_match(struct xt_match *match)
129xt_register_match(struct xt_match *match)
130{ 125{
131 u_int8_t af = match->family; 126 u_int8_t af = match->family;
132 int ret;
133
134 ret = mutex_lock_interruptible(&xt[af].mutex);
135 if (ret != 0)
136 return ret;
137 127
128 mutex_lock(&xt[af].mutex);
138 list_add(&match->list, &xt[af].match); 129 list_add(&match->list, &xt[af].match);
139 mutex_unlock(&xt[af].mutex); 130 mutex_unlock(&xt[af].mutex);
140 131 return 0;
141 return ret;
142} 132}
143EXPORT_SYMBOL(xt_register_match); 133EXPORT_SYMBOL(xt_register_match);
144 134
@@ -194,9 +184,7 @@ struct xt_match *xt_find_match(u8 af, const char *name, u8 revision)
194 struct xt_match *m; 184 struct xt_match *m;
195 int err = -ENOENT; 185 int err = -ENOENT;
196 186
197 if (mutex_lock_interruptible(&xt[af].mutex) != 0) 187 mutex_lock(&xt[af].mutex);
198 return ERR_PTR(-EINTR);
199
200 list_for_each_entry(m, &xt[af].match, list) { 188 list_for_each_entry(m, &xt[af].match, list) {
201 if (strcmp(m->name, name) == 0) { 189 if (strcmp(m->name, name) == 0) {
202 if (m->revision == revision) { 190 if (m->revision == revision) {
@@ -239,9 +227,7 @@ struct xt_target *xt_find_target(u8 af, const char *name, u8 revision)
239 struct xt_target *t; 227 struct xt_target *t;
240 int err = -ENOENT; 228 int err = -ENOENT;
241 229
242 if (mutex_lock_interruptible(&xt[af].mutex) != 0) 230 mutex_lock(&xt[af].mutex);
243 return ERR_PTR(-EINTR);
244
245 list_for_each_entry(t, &xt[af].target, list) { 231 list_for_each_entry(t, &xt[af].target, list) {
246 if (strcmp(t->name, name) == 0) { 232 if (strcmp(t->name, name) == 0) {
247 if (t->revision == revision) { 233 if (t->revision == revision) {
@@ -323,10 +309,7 @@ int xt_find_revision(u8 af, const char *name, u8 revision, int target,
323{ 309{
324 int have_rev, best = -1; 310 int have_rev, best = -1;
325 311
326 if (mutex_lock_interruptible(&xt[af].mutex) != 0) { 312 mutex_lock(&xt[af].mutex);
327 *err = -EINTR;
328 return 1;
329 }
330 if (target == 1) 313 if (target == 1)
331 have_rev = target_revfn(af, name, revision, &best); 314 have_rev = target_revfn(af, name, revision, &best);
332 else 315 else
@@ -732,9 +715,7 @@ struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af,
732{ 715{
733 struct xt_table *t; 716 struct xt_table *t;
734 717
735 if (mutex_lock_interruptible(&xt[af].mutex) != 0) 718 mutex_lock(&xt[af].mutex);
736 return ERR_PTR(-EINTR);
737
738 list_for_each_entry(t, &net->xt.tables[af], list) 719 list_for_each_entry(t, &net->xt.tables[af], list)
739 if (strcmp(t->name, name) == 0 && try_module_get(t->me)) 720 if (strcmp(t->name, name) == 0 && try_module_get(t->me))
740 return t; 721 return t;
@@ -883,10 +864,7 @@ struct xt_table *xt_register_table(struct net *net,
883 goto out; 864 goto out;
884 } 865 }
885 866
886 ret = mutex_lock_interruptible(&xt[table->af].mutex); 867 mutex_lock(&xt[table->af].mutex);
887 if (ret != 0)
888 goto out_free;
889
890 /* Don't autoload: we'd eat our tail... */ 868 /* Don't autoload: we'd eat our tail... */
891 list_for_each_entry(t, &net->xt.tables[table->af], list) { 869 list_for_each_entry(t, &net->xt.tables[table->af], list) {
892 if (strcmp(t->name, table->name) == 0) { 870 if (strcmp(t->name, table->name) == 0) {
@@ -911,9 +889,8 @@ struct xt_table *xt_register_table(struct net *net,
911 mutex_unlock(&xt[table->af].mutex); 889 mutex_unlock(&xt[table->af].mutex);
912 return table; 890 return table;
913 891
914 unlock: 892unlock:
915 mutex_unlock(&xt[table->af].mutex); 893 mutex_unlock(&xt[table->af].mutex);
916out_free:
917 kfree(table); 894 kfree(table);
918out: 895out:
919 return ERR_PTR(ret); 896 return ERR_PTR(ret);
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index a324b4b34c90..2e152e5f2186 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -213,7 +213,7 @@ static int __netlink_deliver_tap_skb(struct sk_buff *skb,
213 nskb->protocol = htons((u16) sk->sk_protocol); 213 nskb->protocol = htons((u16) sk->sk_protocol);
214 nskb->pkt_type = netlink_is_kernel(sk) ? 214 nskb->pkt_type = netlink_is_kernel(sk) ?
215 PACKET_KERNEL : PACKET_USER; 215 PACKET_KERNEL : PACKET_USER;
216 216 skb_reset_network_header(nskb);
217 ret = dev_queue_xmit(nskb); 217 ret = dev_queue_xmit(nskb);
218 if (unlikely(ret > 0)) 218 if (unlikely(ret > 0))
219 ret = net_xmit_errno(ret); 219 ret = net_xmit_errno(ret);
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index 7ad3f029baae..7228ec3faf19 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -47,8 +47,6 @@
47#include <linux/openvswitch.h> 47#include <linux/openvswitch.h>
48#include <linux/rculist.h> 48#include <linux/rculist.h>
49#include <linux/dmi.h> 49#include <linux/dmi.h>
50#include <linux/genetlink.h>
51#include <net/genetlink.h>
52#include <net/genetlink.h> 50#include <net/genetlink.h>
53#include <net/net_namespace.h> 51#include <net/net_namespace.h>
54#include <net/netns/generic.h> 52#include <net/netns/generic.h>