All pastes #885441 Raw Edit

adm5120 switch .24

public diff v1 · immutable
#885441 ·published 2008-01-30 22:27 UTC
rendered paste body
Index: target/linux/adm5120/files/drivers/net/adm5120sw.c===================================================================--- target/linux/adm5120/files/drivers/net/adm5120sw.c	(revision 10328)+++ target/linux/adm5120/files/drivers/net/adm5120sw.c	(working copy)@@ -93,8 +93,14 @@ /* ------------------------------------------------------------------------ */  struct adm5120_if_priv {+	struct net_device *dev;+ 	unsigned int	vlan_no; 	unsigned int	port_mask;++#ifdef CONFIG_ADM5120_SWITCH_NAPI+	struct napi_struct napi;+#endif };  struct dma_desc {@@ -333,7 +339,6 @@ 	SW_DBG("rlda: %08X\n", t); } - /* ------------------------------------------------------------------------ */  static inline void adm5120_rx_dma_update(struct dma_desc *desc,@@ -430,7 +435,7 @@ 				dma_cache_wback_inv((unsigned long)skb->data, 					skb->len); -#ifdef CONFIG_ADM5120_SWITCH_USE_NAPI+#ifdef CONFIG_ADM5120_SWITCH_NAPI 				netif_receive_skb(skb); #else 				netif_rx(skb);@@ -495,9 +500,11 @@ }  #ifdef CONFIG_ADM5120_SWITCH_NAPI-static int adm5120_if_poll(struct net_device *dev, int *budget)+static int adm5120_if_poll(struct napi_struct *napi, int limit) {-	int limit = min(dev->quota, *budget);+	struct adm5120_if_priv *priv = container_of(napi,+				struct adm5120_if_priv, napi);+	struct net_device *dev = priv->dev; 	int done; 	u32 status; @@ -509,13 +516,10 @@ 	SW_DBG("%s: processing RX ring\n", dev->name); 	done = adm5120_switch_rx(limit); -	*budget -= done;-	dev->quota -= done;- 	status = sw_int_status() & SWITCH_INTS_POLL; 	if ((done < limit) && (!status)) { 		SW_DBG("disable polling mode for %s\n", dev->name);-		netif_rx_complete(dev);+		netif_rx_complete(dev, napi); 		sw_int_unmask(SWITCH_INTS_POLL); 		return 0; 	}@@ -524,7 +528,7 @@ 			dev->name, done, status); 	return 1; }-#endif /* CONFIG_ADM5120_SWITCH_USE_NAPI */+#endif /* CONFIG_ADM5120_SWITCH_NAPI */   static irqreturn_t adm5120_switch_irq(int irq, void *dev_id)@@ -541,10 +545,12 @@  	if (status & SWITCH_INTS_POLL) { 		struct net_device *dev = dev_id;+		struct adm5120_if_priv *priv = netdev_priv(dev);+ 		sw_dump_intr_mask("poll ints", status); 		SW_DBG("enable polling mode for %s\n", dev->name); 		sw_int_mask(SWITCH_INTS_POLL);-		netif_rx_schedule(dev);+		netif_rx_schedule(dev, &priv->napi); 	} #else 	sw_int_ack(status);@@ -779,12 +785,31 @@  /* ------------------------------------------------------------------------ */ +#ifdef CONFIG_ADM5120_SWITCH_NAPI+static inline void adm5120_if_napi_enable(struct net_device *dev)+{+	struct adm5120_if_priv *priv = netdev_priv(dev);+	napi_enable(&priv->napi);+}++static inline void adm5120_if_napi_disable(struct net_device *dev)+{+	struct adm5120_if_priv *priv = netdev_priv(dev);+	napi_disable(&priv->napi);+}+#else+static inline void adm5120_if_napi_enable(struct net_device *dev) {}+static inline void adm5120_if_napi_disable(struct net_device *dev) {}+#endif /* CONFIG_ADM5120_SWITCH_NAPI */+ static int adm5120_if_open(struct net_device *dev) { 	u32 t; 	int err; 	int i; +	adm5120_if_napi_enable(dev);+ 	err = request_irq(dev->irq, adm5120_switch_irq, 		(IRQF_SHARED | IRQF_DISABLED), dev->name, dev); 	if (err) {@@ -809,6 +834,7 @@ 	return 0;  err:+	adm5120_if_napi_disable(dev); 	return err; } @@ -819,6 +845,8 @@  	netif_stop_queue(dev); +	adm5120_if_napi_disable(dev);+ 	/* disable port if not assigned to other devices */ 	t = sw_read_reg(SWITCH_REG_PORT_CONF0); 	t |= SWITCH_PORTS_NOCPU;@@ -1001,6 +1029,9 @@ 	if (!dev) 		return NULL; +	priv = netdev_priv(dev);+	priv->dev = dev;+ 	dev->irq		= ADM5120_IRQ_SWITCH; 	dev->open		= adm5120_if_open; 	dev->hard_start_xmit 	= adm5120_if_hard_start_xmit;@@ -1010,13 +1041,11 @@ 	dev->tx_timeout		= adm5120_if_tx_timeout; 	dev->watchdog_timeo 	= TX_TIMEOUT; 	dev->set_mac_address 	= adm5120_if_set_mac_address;+ #ifdef CONFIG_ADM5120_SWITCH_NAPI-	dev->poll		= adm5120_if_poll;-	dev->weight		= 64;+	netif_napi_add(dev, &priv->napi, adm5120_if_poll, 64); #endif -	SET_MODULE_OWNER(dev);- 	return dev; }