diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-05-06 21:19:14 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-05-06 21:19:14 +0000 |
commit | d4d537811bcf327b603605aea8d20295ef317f06 (patch) | |
tree | 044abda1179e26bc1161e60d5a06a7ff784c9bab /target/linux/atheros | |
parent | ecb548b2e5e00f2cfe5689859dded4a9b0b08adf (diff) |
kernel: rewrite the phy packet hook, put it in the network stack to avoid having to keep non-upstream ethernet driver changes
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31637 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/atheros')
4 files changed, 5 insertions, 91 deletions
diff --git a/target/linux/atheros/config-3.3 b/target/linux/atheros/config-3.3 index 6330cca08..fee89d191 100644 --- a/target/linux/atheros/config-3.3 +++ b/target/linux/atheros/config-3.3 @@ -34,6 +34,7 @@ CONFIG_CSRC_R4K_LIB=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DMA_NONCOHERENT=y CONFIG_EARLY_PRINTK=y +CONFIG_ETHERNET_PACKET_MANGLE=y CONFIG_GENERIC_ATOMIC64=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y diff --git a/target/linux/atheros/patches-3.3/110-ar2313_ethernet.patch b/target/linux/atheros/patches-3.3/110-ar2313_ethernet.patch index d3060da44..47c9dd622 100644 --- a/target/linux/atheros/patches-3.3/110-ar2313_ethernet.patch +++ b/target/linux/atheros/patches-3.3/110-ar2313_ethernet.patch @@ -32,7 +32,7 @@ +obj-$(CONFIG_NET_VENDOR_AR231X) += ar231x.o --- /dev/null +++ b/drivers/net/ethernet/ar231x/ar231x.c -@@ -0,0 +1,1282 @@ +@@ -0,0 +1,1279 @@ +/* + * ar231x.c: Linux driver for the Atheros AR231x Ethernet device. + * @@ -784,7 +784,7 @@ + if (sp->rx_skb[idx]) + break; + -+ skb = netdev_alloc_skb(dev, AR2313_BUFSIZE); ++ skb = netdev_alloc_skb_ip_align(dev, AR2313_BUFSIZE); + if (!skb) { + printk("\n\n\n\n %s: No memory in system\n\n\n\n", + __FUNCTION__); @@ -795,7 +795,6 @@ + * Make sure IP header starts on a fresh cache line. + */ + skb->dev = dev; -+ skb_reserve(skb, RX_OFFSET); + sp->rx_skb[idx] = skb; + + rd = (ar231x_descr_t *) & sp->rx_ring[idx]; @@ -867,7 +866,7 @@ + + } else { + /* alloc new buffer. */ -+ skb_new = netdev_alloc_skb(dev, AR2313_BUFSIZE + RX_OFFSET); ++ skb_new = netdev_alloc_skb_ip_align(dev, AR2313_BUFSIZE); + if (skb_new != NULL) { + + skb = sp->rx_skb[idx]; @@ -881,8 +880,6 @@ + netif_rx(skb); + + skb_new->dev = dev; -+ /* 16 bit align */ -+ skb_reserve(skb_new, RX_OFFSET); + /* reset descriptor's curr_addr */ + rxdesc->addr = virt_to_phys(skb_new->data); + diff --git a/target/linux/atheros/patches-3.3/200-ar2313_enable_mvswitch.patch b/target/linux/atheros/patches-3.3/200-ar2313_enable_mvswitch.patch deleted file mode 100644 index 95a993de2..000000000 --- a/target/linux/atheros/patches-3.3/200-ar2313_enable_mvswitch.patch +++ /dev/null @@ -1,70 +0,0 @@ ---- a/drivers/net/ethernet/ar231x/ar231x.c -+++ b/drivers/net/ethernet/ar231x/ar231x.c -@@ -745,6 +745,7 @@ static void ar231x_load_rx_ring(struct n - for (i = 0; i < nr_bufs; i++) { - struct sk_buff *skb; - ar231x_descr_t *rd; -+ int offset = RX_OFFSET; - - if (sp->rx_skb[idx]) - break; -@@ -760,7 +761,9 @@ static void ar231x_load_rx_ring(struct n - * Make sure IP header starts on a fresh cache line. - */ - skb->dev = dev; -- skb_reserve(skb, RX_OFFSET); -+ if (sp->phy_dev) -+ offset += sp->phy_dev->pkt_align; -+ skb_reserve(skb, offset); - sp->rx_skb[idx] = skb; - - rd = (ar231x_descr_t *) & sp->rx_ring[idx]; -@@ -834,20 +837,23 @@ static int ar231x_rx_int(struct net_devi - /* alloc new buffer. */ - skb_new = netdev_alloc_skb(dev, AR2313_BUFSIZE + RX_OFFSET); - if (skb_new != NULL) { -+ int offset; - - skb = sp->rx_skb[idx]; - /* set skb */ - skb_put(skb, - ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN); -- - dev->stats.rx_bytes += skb->len; -- skb->protocol = eth_type_trans(skb, dev); -- /* pass the packet to upper layers */ -- netif_rx(skb); - -+ /* pass the packet to upper layers */ -+ sp->rx(skb); - skb_new->dev = dev; -+ - /* 16 bit align */ -- skb_reserve(skb_new, RX_OFFSET); -+ offset = RX_OFFSET; -+ if (sp->phy_dev) -+ offset += sp->phy_dev->pkt_align; -+ skb_reserve(skb_new, offset); - /* reset descriptor's curr_addr */ - rxdesc->addr = virt_to_phys(skb_new->data); - -@@ -1258,6 +1264,8 @@ static int ar231x_mdiobus_probe (struct - return PTR_ERR(phydev); - } - -+ sp->rx = phydev->netif_rx; -+ - /* mask with MAC supported features */ - phydev->supported &= (SUPPORTED_10baseT_Half - | SUPPORTED_10baseT_Full ---- a/drivers/net/ethernet/ar231x/ar231x.h -+++ b/drivers/net/ethernet/ar231x/ar231x.h -@@ -222,6 +222,8 @@ typedef struct { - */ - struct ar231x_private { - struct net_device *dev; -+ int (*rx)(struct sk_buff *skb); -+ - int version; - u32 mb[2]; - diff --git a/target/linux/atheros/patches-3.3/220-enet_micrel_workaround.patch b/target/linux/atheros/patches-3.3/220-enet_micrel_workaround.patch index 3536552e9..56c7cd545 100644 --- a/target/linux/atheros/patches-3.3/220-enet_micrel_workaround.patch +++ b/target/linux/atheros/patches-3.3/220-enet_micrel_workaround.patch @@ -43,21 +43,7 @@ kfree(dev); return 0; } -@@ -846,7 +864,12 @@ static int ar231x_rx_int(struct net_devi - dev->stats.rx_bytes += skb->len; - - /* pass the packet to upper layers */ -- sp->rx(skb); -+ if (sp->rx) { -+ sp->rx(skb); -+ } else { -+ skb->protocol = eth_type_trans(skb, skb->dev); -+ netif_rx(skb); -+ } - skb_new->dev = dev; - - /* 16 bit align */ -@@ -1142,6 +1165,9 @@ static int ar231x_ioctl(struct net_devic +@@ -1133,6 +1151,9 @@ static int ar231x_ioctl(struct net_devic struct ar231x_private *sp = netdev_priv(dev); int ret; |