提交 60eea6cf 编写于 作者: P Paul Gortmaker

atm: remove the coupling to token ring support

The token ring support is going away, so decouple
the atm support from it in advance.
Signed-off-by: NPaul Gortmaker <paul.gortmaker@windriver.com>
上级 1abd2296
...@@ -21,13 +21,6 @@ ...@@ -21,13 +21,6 @@
/* Maximum number of LEC interfaces (tweakable) */ /* Maximum number of LEC interfaces (tweakable) */
#define MAX_LEC_ITF 48 #define MAX_LEC_ITF 48
/*
* From the total of MAX_LEC_ITF, last NUM_TR_DEVS are reserved for Token Ring.
* E.g. if MAX_LEC_ITF = 48 and NUM_TR_DEVS = 8, then lec0-lec39 are for
* Ethernet ELANs and lec40-lec47 are for Token Ring ELANS.
*/
#define NUM_TR_DEVS 8
typedef enum { typedef enum {
l_set_mac_addr, l_set_mac_addr,
l_del_mac_addr, l_del_mac_addr,
......
...@@ -26,11 +26,6 @@ ...@@ -26,11 +26,6 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
/* TokenRing if needed */
#ifdef CONFIG_TR
#include <linux/trdevice.h>
#endif
/* And atm device */ /* And atm device */
#include <linux/atmdev.h> #include <linux/atmdev.h>
#include <linux/atmlec.h> #include <linux/atmlec.h>
...@@ -162,50 +157,6 @@ static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev) ...@@ -162,50 +157,6 @@ static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev)
} }
#endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */ #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */
/*
* Modelled after tr_type_trans
* All multicast and ARE or STE frames go to BUS.
* Non source routed frames go by destination address.
* Last hop source routed frames go by destination address.
* Not last hop source routed frames go by _next_ route descriptor.
* Returns pointer to destination MAC address or fills in rdesc
* and returns NULL.
*/
#ifdef CONFIG_TR
static unsigned char *get_tr_dst(unsigned char *packet, unsigned char *rdesc)
{
struct trh_hdr *trh;
unsigned int riflen, num_rdsc;
trh = (struct trh_hdr *)packet;
if (trh->daddr[0] & (uint8_t) 0x80)
return bus_mac; /* multicast */
if (trh->saddr[0] & TR_RII) {
riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8;
if ((ntohs(trh->rcf) >> 13) != 0)
return bus_mac; /* ARE or STE */
} else
return trh->daddr; /* not source routed */
if (riflen < 6)
return trh->daddr; /* last hop, source routed */
/* riflen is 6 or more, packet has more than one route descriptor */
num_rdsc = (riflen / 2) - 1;
memset(rdesc, 0, ETH_ALEN);
/* offset 4 comes from LAN destination field in LE control frames */
if (trh->rcf & htons((uint16_t) TR_RCF_DIR_BIT))
memcpy(&rdesc[4], &trh->rseg[num_rdsc - 2], sizeof(__be16));
else {
memcpy(&rdesc[4], &trh->rseg[1], sizeof(__be16));
rdesc[5] = ((ntohs(trh->rseg[0]) & 0x000f) | (rdesc[5] & 0xf0));
}
return NULL;
}
#endif /* CONFIG_TR */
/* /*
* Open/initialize the netdevice. This is called (in the current kernel) * Open/initialize the netdevice. This is called (in the current kernel)
* sometime after booting when the 'ifconfig' program is run. * sometime after booting when the 'ifconfig' program is run.
...@@ -257,9 +208,6 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb, ...@@ -257,9 +208,6 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb,
struct lec_arp_table *entry; struct lec_arp_table *entry;
unsigned char *dst; unsigned char *dst;
int min_frame_size; int min_frame_size;
#ifdef CONFIG_TR
unsigned char rdesc[ETH_ALEN]; /* Token Ring route descriptor */
#endif
int is_rdesc; int is_rdesc;
pr_debug("called\n"); pr_debug("called\n");
...@@ -290,24 +238,10 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb, ...@@ -290,24 +238,10 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb,
} }
skb_push(skb, 2); skb_push(skb, 2);
/* Put le header to place, works for TokenRing too */ /* Put le header to place */
lec_h = (struct lecdatahdr_8023 *)skb->data; lec_h = (struct lecdatahdr_8023 *)skb->data;
lec_h->le_header = htons(priv->lecid); lec_h->le_header = htons(priv->lecid);
#ifdef CONFIG_TR
/*
* Ugly. Use this to realign Token Ring packets for
* e.g. PCA-200E driver.
*/
if (priv->is_trdev) {
skb2 = skb_realloc_headroom(skb, LEC_HEADER_LEN);
kfree_skb(skb);
if (skb2 == NULL)
return NETDEV_TX_OK;
skb = skb2;
}
#endif
#if DUMP_PACKETS >= 2 #if DUMP_PACKETS >= 2
#define MAX_DUMP_SKB 99 #define MAX_DUMP_SKB 99
#elif DUMP_PACKETS >= 1 #elif DUMP_PACKETS >= 1
...@@ -321,12 +255,7 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb, ...@@ -321,12 +255,7 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb,
#endif /* DUMP_PACKETS >= 1 */ #endif /* DUMP_PACKETS >= 1 */
/* Minimum ethernet-frame size */ /* Minimum ethernet-frame size */
#ifdef CONFIG_TR min_frame_size = LEC_MINIMUM_8023_SIZE;
if (priv->is_trdev)
min_frame_size = LEC_MINIMUM_8025_SIZE;
else
#endif
min_frame_size = LEC_MINIMUM_8023_SIZE;
if (skb->len < min_frame_size) { if (skb->len < min_frame_size) {
if ((skb->len + skb_tailroom(skb)) < min_frame_size) { if ((skb->len + skb_tailroom(skb)) < min_frame_size) {
skb2 = skb_copy_expand(skb, 0, skb2 = skb_copy_expand(skb, 0,
...@@ -345,15 +274,6 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb, ...@@ -345,15 +274,6 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb,
/* Send to right vcc */ /* Send to right vcc */
is_rdesc = 0; is_rdesc = 0;
dst = lec_h->h_dest; dst = lec_h->h_dest;
#ifdef CONFIG_TR
if (priv->is_trdev) {
dst = get_tr_dst(skb->data + 2, rdesc);
if (dst == NULL) {
dst = rdesc;
is_rdesc = 1;
}
}
#endif
entry = NULL; entry = NULL;
vcc = lec_arp_resolve(priv, dst, is_rdesc, &entry); vcc = lec_arp_resolve(priv, dst, is_rdesc, &entry);
pr_debug("%s:vcc:%p vcc_flags:%lx, entry:%p\n", pr_debug("%s:vcc:%p vcc_flags:%lx, entry:%p\n",
...@@ -710,12 +630,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb) ...@@ -710,12 +630,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb)
dev_kfree_skb(skb); dev_kfree_skb(skb);
return; return;
} }
#ifdef CONFIG_TR dst = ((struct lecdatahdr_8023 *)skb->data)->h_dest;
if (priv->is_trdev)
dst = ((struct lecdatahdr_8025 *)skb->data)->h_dest;
else
#endif
dst = ((struct lecdatahdr_8023 *)skb->data)->h_dest;
/* /*
* If this is a Data Direct VCC, and the VCC does not match * If this is a Data Direct VCC, and the VCC does not match
...@@ -723,16 +638,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb) ...@@ -723,16 +638,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb)
*/ */
spin_lock_irqsave(&priv->lec_arp_lock, flags); spin_lock_irqsave(&priv->lec_arp_lock, flags);
if (lec_is_data_direct(vcc)) { if (lec_is_data_direct(vcc)) {
#ifdef CONFIG_TR src = ((struct lecdatahdr_8023 *)skb->data)->h_source;
if (priv->is_trdev)
src =
((struct lecdatahdr_8025 *)skb->data)->
h_source;
else
#endif
src =
((struct lecdatahdr_8023 *)skb->data)->
h_source;
entry = lec_arp_find(priv, src); entry = lec_arp_find(priv, src);
if (entry && entry->vcc != vcc) { if (entry && entry->vcc != vcc) {
lec_arp_remove(priv, entry); lec_arp_remove(priv, entry);
...@@ -750,12 +656,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb) ...@@ -750,12 +656,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb)
if (!hlist_empty(&priv->lec_arp_empty_ones)) if (!hlist_empty(&priv->lec_arp_empty_ones))
lec_arp_check_empties(priv, vcc, skb); lec_arp_check_empties(priv, vcc, skb);
skb_pull(skb, 2); /* skip lec_id */ skb_pull(skb, 2); /* skip lec_id */
#ifdef CONFIG_TR skb->protocol = eth_type_trans(skb, dev);
if (priv->is_trdev)
skb->protocol = tr_type_trans(skb, dev);
else
#endif
skb->protocol = eth_type_trans(skb, dev);
dev->stats.rx_packets++; dev->stats.rx_packets++;
dev->stats.rx_bytes += skb->len; dev->stats.rx_bytes += skb->len;
memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data));
...@@ -827,27 +728,13 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) ...@@ -827,27 +728,13 @@ static int lecd_attach(struct atm_vcc *vcc, int arg)
i = 0; i = 0;
else else
i = arg; i = arg;
#ifdef CONFIG_TR
if (arg >= MAX_LEC_ITF) if (arg >= MAX_LEC_ITF)
return -EINVAL; return -EINVAL;
#else /* Reserve the top NUM_TR_DEVS for TR */
if (arg >= (MAX_LEC_ITF - NUM_TR_DEVS))
return -EINVAL;
#endif
if (!dev_lec[i]) { if (!dev_lec[i]) {
int is_trdev, size; int size;
is_trdev = 0;
if (i >= (MAX_LEC_ITF - NUM_TR_DEVS))
is_trdev = 1;
size = sizeof(struct lec_priv); size = sizeof(struct lec_priv);
#ifdef CONFIG_TR dev_lec[i] = alloc_etherdev(size);
if (is_trdev)
dev_lec[i] = alloc_trdev(size);
else
#endif
dev_lec[i] = alloc_etherdev(size);
if (!dev_lec[i]) if (!dev_lec[i])
return -ENOMEM; return -ENOMEM;
dev_lec[i]->netdev_ops = &lec_netdev_ops; dev_lec[i]->netdev_ops = &lec_netdev_ops;
...@@ -858,7 +745,6 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) ...@@ -858,7 +745,6 @@ static int lecd_attach(struct atm_vcc *vcc, int arg)
} }
priv = netdev_priv(dev_lec[i]); priv = netdev_priv(dev_lec[i]);
priv->is_trdev = is_trdev;
} else { } else {
priv = netdev_priv(dev_lec[i]); priv = netdev_priv(dev_lec[i]);
if (priv->lecd) if (priv->lecd)
...@@ -2372,15 +2258,7 @@ lec_arp_check_empties(struct lec_priv *priv, ...@@ -2372,15 +2258,7 @@ lec_arp_check_empties(struct lec_priv *priv,
struct hlist_node *node, *next; struct hlist_node *node, *next;
struct lec_arp_table *entry, *tmp; struct lec_arp_table *entry, *tmp;
struct lecdatahdr_8023 *hdr = (struct lecdatahdr_8023 *)skb->data; struct lecdatahdr_8023 *hdr = (struct lecdatahdr_8023 *)skb->data;
unsigned char *src; unsigned char *src = hdr->h_source;
#ifdef CONFIG_TR
struct lecdatahdr_8025 *tr_hdr = (struct lecdatahdr_8025 *)skb->data;
if (priv->is_trdev)
src = tr_hdr->h_source;
else
#endif
src = hdr->h_source;
spin_lock_irqsave(&priv->lec_arp_lock, flags); spin_lock_irqsave(&priv->lec_arp_lock, flags);
hlist_for_each_entry_safe(entry, node, next, hlist_for_each_entry_safe(entry, node, next,
......
...@@ -142,7 +142,6 @@ struct lec_priv { ...@@ -142,7 +142,6 @@ struct lec_priv {
int itfnum; /* e.g. 2 for lec2, 5 for lec5 */ int itfnum; /* e.g. 2 for lec2, 5 for lec5 */
struct lane2_ops *lane2_ops; /* can be NULL for LANE v1 */ struct lane2_ops *lane2_ops; /* can be NULL for LANE v1 */
int is_proxy; /* bridge between ATM and Ethernet */ int is_proxy; /* bridge between ATM and Ethernet */
int is_trdev; /* Device type, 0 = Ethernet, 1 = TokenRing */
}; };
struct lec_vcc_priv { struct lec_vcc_priv {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册