netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] (4//8) dscc4 convert to new hdlc_device
@ 2003-12-02 21:58 Stephen Hemminger
  0 siblings, 0 replies; 2+ messages in thread
From: Stephen Hemminger @ 2003-12-02 21:58 UTC (permalink / raw)
  To: Krzysztof Halas, Jeff Garzik; +Cc: netdev

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1493  -> 1.1494 
#	drivers/net/wan/dscc4.c	1.51    -> 1.52   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/11/26	shemminger@osdl.org	1.1494
# Convert to work with hdlc_device that is not embedded.
# Use list macros for list of ports on card.
# --------------------------------------------
#
diff -Nru a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c
--- a/drivers/net/wan/dscc4.c	Wed Nov 26 12:30:13 2003
+++ b/drivers/net/wan/dscc4.c	Wed Nov 26 12:30:13 2003
@@ -185,12 +185,14 @@
         spinlock_t lock;
         struct pci_dev *pdev;
 
-        struct dscc4_dev_priv *root;
+	struct list_head devs;
         dma_addr_t iqcfg_dma;
 	u32 xtal_hz;
 };
 
 struct dscc4_dev_priv {
+	struct list_head dev_list;
+
         struct sk_buff *rx_skbuff[RX_RING_SIZE];
         struct sk_buff *tx_skbuff[TX_RING_SIZE];
 
@@ -228,7 +230,7 @@
 
 	unsigned short encoding;
 	unsigned short parity;
-	hdlc_device hdlc;
+	hdlc_device *hdlc;
 	sync_serial_settings settings;
 	u32 __pad __attribute__ ((aligned (4)));
 };
@@ -371,9 +373,17 @@
 static int dscc4_tx_poll(struct dscc4_dev_priv *, struct net_device *);
 #endif
 
+static inline struct dscc4_dev_priv *dscc4_root_priv(struct dscc4_pci_priv *ppriv)
+{
+	struct list_head *first = ppriv->devs.next;
+
+	return (first == &ppriv->devs) ? NULL 
+		: list_entry(first, struct dscc4_dev_priv, dev_list);
+}
+
 static inline struct dscc4_dev_priv *dscc4_priv(struct net_device *dev)
 {
-	return list_entry(dev, struct dscc4_dev_priv, hdlc.netdev);
+	return dev_to_hdlc(dev)->dev_data;
 }
 
 static void scc_patchl(u32 mask, u32 value, struct dscc4_dev_priv *dpriv,
@@ -636,7 +646,7 @@
 				struct net_device *dev)
 {
 	struct RxFD *rx_fd = dpriv->rx_fd + dpriv->rx_current%RX_RING_SIZE;
-	struct net_device_stats *stats = &dpriv->hdlc.stats;
+	struct net_device_stats *stats = &dpriv->hdlc->stats;
 	struct pci_dev *pdev = dpriv->pci_priv->pdev;
 	struct sk_buff *skb;
 	int pkt_len;
@@ -681,19 +691,16 @@
 
 static void dscc4_free1(struct pci_dev *pdev)
 {
-	struct dscc4_pci_priv *ppriv;
-	struct dscc4_dev_priv *root;
-	int i;
+	struct dscc4_pci_priv *ppriv = pci_get_drvdata(pdev);
+	struct dscc4_dev_priv *dpriv, *dnext;
 
-	ppriv = pci_get_drvdata(pdev);
-	root = ppriv->root;
-
-	for (i = 0; i < dev_per_card; i++)
-		unregister_hdlc_device(&root[i].hdlc);
+	list_for_each_entry_safe(dpriv, dnext, &ppriv->devs, dev_list) {
+		unregister_hdlc_device(dpriv->hdlc);
+		free_hdlc_device(dpriv->hdlc);
+	}
 
 	pci_set_drvdata(pdev, NULL);
 
-	kfree(root);
 	kfree(ppriv);
 }
 
@@ -704,7 +711,6 @@
 	struct dscc4_dev_priv *dpriv;
 	static int cards_found = 0;
 	unsigned long ioaddr;
-	int i;
 
 	printk(KERN_DEBUG "%s", version);
 
@@ -743,7 +749,8 @@
 
 	priv = (struct dscc4_pci_priv *)pci_get_drvdata(pdev);
 
-	if (request_irq(pdev->irq, &dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root)){
+	if (request_irq(pdev->irq, &dscc4_irq, SA_SHIRQ, DRV_NAME, 
+			dscc4_root_priv(priv))) {
 		printk(KERN_WARNING "%s: IRQ %d busy\n", DRV_NAME, pdev->irq);
 		goto err_out_free1;
 	}
@@ -772,21 +779,19 @@
 	 * SCC 0-3 private rx/tx irq structures
 	 * IQRX/TXi needs to be set soon. Learned it the hard way...
 	 */
-	for (i = 0; i < dev_per_card; i++) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		dpriv->iqtx = (u32 *) pci_alloc_consistent(pdev,
 			IRQ_RING_SIZE*sizeof(u32), &dpriv->iqtx_dma);
 		if (!dpriv->iqtx)
 			goto err_out_free_iqtx;
-		writel(dpriv->iqtx_dma, ioaddr + IQTX0 + i*4);
+		writel(dpriv->iqtx_dma, ioaddr + IQTX0 + dpriv->dev_id*4);
 	}
-	for (i = 0; i < dev_per_card; i++) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		dpriv->iqrx = (u32 *) pci_alloc_consistent(pdev,
 			IRQ_RING_SIZE*sizeof(u32), &dpriv->iqrx_dma);
 		if (!dpriv->iqrx)
 			goto err_out_free_iqrx;
-		writel(dpriv->iqrx_dma, ioaddr + IQRX0 + i*4);
+		writel(dpriv->iqrx_dma, ioaddr + IQRX0 + dpriv->dev_id*4);
 	}
 
 	/* Cf application hint. Beware of hard-lock condition on threshold. */
@@ -804,22 +809,19 @@
 	return 0;
 
 err_out_free_iqrx:
-	while (--i >= 0) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32),
 				    dpriv->iqrx, dpriv->iqrx_dma);
 	}
-	i = dev_per_card;
 err_out_free_iqtx:
-	while (--i >= 0) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32),
 				    dpriv->iqtx, dpriv->iqtx_dma);
 	}
 	pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), priv->iqcfg,
 			    priv->iqcfg_dma);
 err_out_free_irq:
-	free_irq(pdev->irq, priv->root);
+	free_irq(pdev->irq, dscc4_root_priv(priv));
 err_out_free1:
 	dscc4_free1(pdev);
 err_out_iounmap:
@@ -863,29 +865,27 @@
 static int dscc4_found1(struct pci_dev *pdev, unsigned long ioaddr)
 {
 	struct dscc4_pci_priv *ppriv;
-	struct dscc4_dev_priv *root;
+	struct dscc4_dev_priv *dpriv, *dnext;
 	int i, ret = -ENOMEM;
 
-	root = (struct dscc4_dev_priv *)
-		kmalloc(dev_per_card*sizeof(*root), GFP_KERNEL);
-	if (!root) {
-		printk(KERN_ERR "%s: can't allocate data\n", DRV_NAME);
-		goto err_out;
-	}
-	memset(root, 0, dev_per_card*sizeof(*root));
-
 	ppriv = (struct dscc4_pci_priv *) kmalloc(sizeof(*ppriv), GFP_KERNEL);
 	if (!ppriv) {
 		printk(KERN_ERR "%s: can't allocate private data\n", DRV_NAME);
-		goto err_free_dev;
+		goto err_out;
 	}
 	memset(ppriv, 0, sizeof(struct dscc4_pci_priv));
+	INIT_LIST_HEAD(&ppriv->devs);
 
 	for (i = 0; i < dev_per_card; i++) {
-		struct dscc4_dev_priv *dpriv = root + i;
-		hdlc_device *hdlc = &dpriv->hdlc;
-		struct net_device *d = hdlc_to_dev(hdlc);
+		hdlc_device *hdlc = alloc_hdlc_device(sizeof(*dpriv));
+		struct net_device *d;
+
+		if (!hdlc) {
+			ret = -ENOMEM;
+			goto err_unregister;
+		}
 
+		d = hdlc_to_dev(hdlc);
 	        d->base_addr = ioaddr;
 		d->init = NULL;
 	        d->irq = pdev->irq;
@@ -898,6 +898,8 @@
 		SET_MODULE_OWNER(d);
 		SET_NETDEV_DEV(d, &pdev->dev);
 
+		dpriv = dscc4_priv(d);
+		dpriv->hdlc = hdlc;
 		dpriv->dev_id = i;
 		dpriv->pci_priv = ppriv;
 		spin_lock_init(&dpriv->lock);
@@ -920,23 +922,25 @@
 			unregister_hdlc_device(hdlc);
 			goto err_unregister;
 		}
+		list_add_tail(&dpriv->dev_list, &ppriv->devs);
 	}
-	ret = dscc4_set_quartz(root, quartz);
+
+
+	ret = dscc4_set_quartz(dscc4_root_priv(ppriv), quartz);
 	if (ret < 0)
 		goto err_unregister;
-	ppriv->root = root;
+
 	spin_lock_init(&ppriv->lock);
 	pci_set_drvdata(pdev, ppriv);
 	return ret;
 
 err_unregister:
-	while (--i >= 0) {
-		dscc4_release_ring(root + i);
-		unregister_hdlc_device(&root[i].hdlc);
+	list_for_each_entry_safe(dpriv, dnext, &ppriv->devs, dev_list) {
+		dscc4_release_ring(dpriv);
+		unregister_hdlc_device(dpriv->hdlc);
+		free_hdlc_device(dpriv->hdlc);
 	}
 	kfree(ppriv);
-err_free_dev:
-	kfree(root);
 err_out:
 	return ret;
 };
@@ -964,7 +968,7 @@
 	sync_serial_settings *settings = &dpriv->settings;
 
 	if (settings->loopback && (settings->clock_type != CLOCK_INT)) {
-		struct net_device *dev = hdlc_to_dev(&dpriv->hdlc);
+		struct net_device *dev = hdlc_to_dev(dpriv->hdlc);
 
 		printk(KERN_INFO "%s: loopback requires clock\n", dev->name);
 		return -1;
@@ -1015,7 +1019,7 @@
 static int dscc4_open(struct net_device *dev)
 {
 	struct dscc4_dev_priv *dpriv = dscc4_priv(dev);
-	hdlc_device *hdlc = &dpriv->hdlc;
+	hdlc_device *hdlc = dpriv->hdlc;
 	struct dscc4_pci_priv *ppriv;
 	int ret = -EAGAIN;
 
@@ -1467,7 +1471,7 @@
 	int i, handled = 1;
 
 	priv = root->pci_priv;
-	dev = hdlc_to_dev(&root->hdlc);
+	dev = hdlc_to_dev(root->hdlc);
 
 	spin_lock_irqsave(&priv->lock, flags);
 
@@ -1518,7 +1522,7 @@
 static inline void dscc4_tx_irq(struct dscc4_pci_priv *ppriv,
 				struct dscc4_dev_priv *dpriv)
 {
-	struct net_device *dev = hdlc_to_dev(&dpriv->hdlc);
+	struct net_device *dev = hdlc_to_dev(dpriv->hdlc);
 	u32 state;
 	int cur, loop = 0;
 
@@ -1549,7 +1553,7 @@
 
 	if (state & SccEvt) {
 		if (state & Alls) {
-			struct net_device_stats *stats = &dpriv->hdlc.stats;
+			struct net_device_stats *stats = &dpriv->hdlc->stats;
 			struct sk_buff *skb;
 			struct TxFD *tx_fd;
 
@@ -1687,7 +1691,7 @@
 static inline void dscc4_rx_irq(struct dscc4_pci_priv *priv,
 				    struct dscc4_dev_priv *dpriv)
 {
-	struct net_device *dev = hdlc_to_dev(&dpriv->hdlc);
+	struct net_device *dev = hdlc_to_dev(dpriv->hdlc);
 	u32 state;
 	int cur;
 
@@ -1954,23 +1958,21 @@
 static void __devexit dscc4_remove_one(struct pci_dev *pdev)
 {
 	struct dscc4_pci_priv *ppriv;
-	struct dscc4_dev_priv *root;
+	struct dscc4_dev_priv *root,  *dpriv;
 	unsigned long ioaddr;
-	int i;
 
 	ppriv = pci_get_drvdata(pdev);
-	root = ppriv->root;
+	root = dscc4_root_priv(ppriv);
 
-	ioaddr = hdlc_to_dev(&root->hdlc)->base_addr;
+	ioaddr = hdlc_to_dev(root->hdlc)->base_addr;
 
 	dscc4_pci_reset(pdev, ioaddr);
 
 	free_irq(pdev->irq, root);
 	pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), ppriv->iqcfg,
 			    ppriv->iqcfg_dma);
-	for (i = 0; i < dev_per_card; i++) {
-		struct dscc4_dev_priv *dpriv = root + i;
 
+	list_for_each_entry(dpriv, &ppriv->devs, dev_list) {
 		dscc4_release_ring(dpriv);
 		pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32),
 				    dpriv->iqrx, dpriv->iqrx_dma);

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH] (4//8) dscc4 convert to new hdlc_device
@ 2003-12-02 22:01 Stephen Hemminger
  0 siblings, 0 replies; 2+ messages in thread
From: Stephen Hemminger @ 2003-12-02 22:01 UTC (permalink / raw)
  To: Krzysztof Halas, Jeff Garzik; +Cc: netdev

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1493  -> 1.1494 
#	drivers/net/wan/dscc4.c	1.51    -> 1.52   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/11/26	shemminger@osdl.org	1.1494
# Convert to work with hdlc_device that is not embedded.
# Use list macros for list of ports on card.
# --------------------------------------------
#
diff -Nru a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c
--- a/drivers/net/wan/dscc4.c	Wed Nov 26 12:30:13 2003
+++ b/drivers/net/wan/dscc4.c	Wed Nov 26 12:30:13 2003
@@ -185,12 +185,14 @@
         spinlock_t lock;
         struct pci_dev *pdev;
 
-        struct dscc4_dev_priv *root;
+	struct list_head devs;
         dma_addr_t iqcfg_dma;
 	u32 xtal_hz;
 };
 
 struct dscc4_dev_priv {
+	struct list_head dev_list;
+
         struct sk_buff *rx_skbuff[RX_RING_SIZE];
         struct sk_buff *tx_skbuff[TX_RING_SIZE];
 
@@ -228,7 +230,7 @@
 
 	unsigned short encoding;
 	unsigned short parity;
-	hdlc_device hdlc;
+	hdlc_device *hdlc;
 	sync_serial_settings settings;
 	u32 __pad __attribute__ ((aligned (4)));
 };
@@ -371,9 +373,17 @@
 static int dscc4_tx_poll(struct dscc4_dev_priv *, struct net_device *);
 #endif
 
+static inline struct dscc4_dev_priv *dscc4_root_priv(struct dscc4_pci_priv *ppriv)
+{
+	struct list_head *first = ppriv->devs.next;
+
+	return (first == &ppriv->devs) ? NULL 
+		: list_entry(first, struct dscc4_dev_priv, dev_list);
+}
+
 static inline struct dscc4_dev_priv *dscc4_priv(struct net_device *dev)
 {
-	return list_entry(dev, struct dscc4_dev_priv, hdlc.netdev);
+	return dev_to_hdlc(dev)->dev_data;
 }
 
 static void scc_patchl(u32 mask, u32 value, struct dscc4_dev_priv *dpriv,
@@ -636,7 +646,7 @@
 				struct net_device *dev)
 {
 	struct RxFD *rx_fd = dpriv->rx_fd + dpriv->rx_current%RX_RING_SIZE;
-	struct net_device_stats *stats = &dpriv->hdlc.stats;
+	struct net_device_stats *stats = &dpriv->hdlc->stats;
 	struct pci_dev *pdev = dpriv->pci_priv->pdev;
 	struct sk_buff *skb;
 	int pkt_len;
@@ -681,19 +691,16 @@
 
 static void dscc4_free1(struct pci_dev *pdev)
 {
-	struct dscc4_pci_priv *ppriv;
-	struct dscc4_dev_priv *root;
-	int i;
+	struct dscc4_pci_priv *ppriv = pci_get_drvdata(pdev);
+	struct dscc4_dev_priv *dpriv, *dnext;
 
-	ppriv = pci_get_drvdata(pdev);
-	root = ppriv->root;
-
-	for (i = 0; i < dev_per_card; i++)
-		unregister_hdlc_device(&root[i].hdlc);
+	list_for_each_entry_safe(dpriv, dnext, &ppriv->devs, dev_list) {
+		unregister_hdlc_device(dpriv->hdlc);
+		free_hdlc_device(dpriv->hdlc);
+	}
 
 	pci_set_drvdata(pdev, NULL);
 
-	kfree(root);
 	kfree(ppriv);
 }
 
@@ -704,7 +711,6 @@
 	struct dscc4_dev_priv *dpriv;
 	static int cards_found = 0;
 	unsigned long ioaddr;
-	int i;
 
 	printk(KERN_DEBUG "%s", version);
 
@@ -743,7 +749,8 @@
 
 	priv = (struct dscc4_pci_priv *)pci_get_drvdata(pdev);
 
-	if (request_irq(pdev->irq, &dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root)){
+	if (request_irq(pdev->irq, &dscc4_irq, SA_SHIRQ, DRV_NAME, 
+			dscc4_root_priv(priv))) {
 		printk(KERN_WARNING "%s: IRQ %d busy\n", DRV_NAME, pdev->irq);
 		goto err_out_free1;
 	}
@@ -772,21 +779,19 @@
 	 * SCC 0-3 private rx/tx irq structures
 	 * IQRX/TXi needs to be set soon. Learned it the hard way...
 	 */
-	for (i = 0; i < dev_per_card; i++) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		dpriv->iqtx = (u32 *) pci_alloc_consistent(pdev,
 			IRQ_RING_SIZE*sizeof(u32), &dpriv->iqtx_dma);
 		if (!dpriv->iqtx)
 			goto err_out_free_iqtx;
-		writel(dpriv->iqtx_dma, ioaddr + IQTX0 + i*4);
+		writel(dpriv->iqtx_dma, ioaddr + IQTX0 + dpriv->dev_id*4);
 	}
-	for (i = 0; i < dev_per_card; i++) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		dpriv->iqrx = (u32 *) pci_alloc_consistent(pdev,
 			IRQ_RING_SIZE*sizeof(u32), &dpriv->iqrx_dma);
 		if (!dpriv->iqrx)
 			goto err_out_free_iqrx;
-		writel(dpriv->iqrx_dma, ioaddr + IQRX0 + i*4);
+		writel(dpriv->iqrx_dma, ioaddr + IQRX0 + dpriv->dev_id*4);
 	}
 
 	/* Cf application hint. Beware of hard-lock condition on threshold. */
@@ -804,22 +809,19 @@
 	return 0;
 
 err_out_free_iqrx:
-	while (--i >= 0) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32),
 				    dpriv->iqrx, dpriv->iqrx_dma);
 	}
-	i = dev_per_card;
 err_out_free_iqtx:
-	while (--i >= 0) {
-		dpriv = priv->root + i;
+	list_for_each_entry(dpriv, &priv->devs, dev_list) {
 		pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32),
 				    dpriv->iqtx, dpriv->iqtx_dma);
 	}
 	pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), priv->iqcfg,
 			    priv->iqcfg_dma);
 err_out_free_irq:
-	free_irq(pdev->irq, priv->root);
+	free_irq(pdev->irq, dscc4_root_priv(priv));
 err_out_free1:
 	dscc4_free1(pdev);
 err_out_iounmap:
@@ -863,29 +865,27 @@
 static int dscc4_found1(struct pci_dev *pdev, unsigned long ioaddr)
 {
 	struct dscc4_pci_priv *ppriv;
-	struct dscc4_dev_priv *root;
+	struct dscc4_dev_priv *dpriv, *dnext;
 	int i, ret = -ENOMEM;
 
-	root = (struct dscc4_dev_priv *)
-		kmalloc(dev_per_card*sizeof(*root), GFP_KERNEL);
-	if (!root) {
-		printk(KERN_ERR "%s: can't allocate data\n", DRV_NAME);
-		goto err_out;
-	}
-	memset(root, 0, dev_per_card*sizeof(*root));
-
 	ppriv = (struct dscc4_pci_priv *) kmalloc(sizeof(*ppriv), GFP_KERNEL);
 	if (!ppriv) {
 		printk(KERN_ERR "%s: can't allocate private data\n", DRV_NAME);
-		goto err_free_dev;
+		goto err_out;
 	}
 	memset(ppriv, 0, sizeof(struct dscc4_pci_priv));
+	INIT_LIST_HEAD(&ppriv->devs);
 
 	for (i = 0; i < dev_per_card; i++) {
-		struct dscc4_dev_priv *dpriv = root + i;
-		hdlc_device *hdlc = &dpriv->hdlc;
-		struct net_device *d = hdlc_to_dev(hdlc);
+		hdlc_device *hdlc = alloc_hdlc_device(sizeof(*dpriv));
+		struct net_device *d;
+
+		if (!hdlc) {
+			ret = -ENOMEM;
+			goto err_unregister;
+		}
 
+		d = hdlc_to_dev(hdlc);
 	        d->base_addr = ioaddr;
 		d->init = NULL;
 	        d->irq = pdev->irq;
@@ -898,6 +898,8 @@
 		SET_MODULE_OWNER(d);
 		SET_NETDEV_DEV(d, &pdev->dev);
 
+		dpriv = dscc4_priv(d);
+		dpriv->hdlc = hdlc;
 		dpriv->dev_id = i;
 		dpriv->pci_priv = ppriv;
 		spin_lock_init(&dpriv->lock);
@@ -920,23 +922,25 @@
 			unregister_hdlc_device(hdlc);
 			goto err_unregister;
 		}
+		list_add_tail(&dpriv->dev_list, &ppriv->devs);
 	}
-	ret = dscc4_set_quartz(root, quartz);
+
+
+	ret = dscc4_set_quartz(dscc4_root_priv(ppriv), quartz);
 	if (ret < 0)
 		goto err_unregister;
-	ppriv->root = root;
+
 	spin_lock_init(&ppriv->lock);
 	pci_set_drvdata(pdev, ppriv);
 	return ret;
 
 err_unregister:
-	while (--i >= 0) {
-		dscc4_release_ring(root + i);
-		unregister_hdlc_device(&root[i].hdlc);
+	list_for_each_entry_safe(dpriv, dnext, &ppriv->devs, dev_list) {
+		dscc4_release_ring(dpriv);
+		unregister_hdlc_device(dpriv->hdlc);
+		free_hdlc_device(dpriv->hdlc);
 	}
 	kfree(ppriv);
-err_free_dev:
-	kfree(root);
 err_out:
 	return ret;
 };
@@ -964,7 +968,7 @@
 	sync_serial_settings *settings = &dpriv->settings;
 
 	if (settings->loopback && (settings->clock_type != CLOCK_INT)) {
-		struct net_device *dev = hdlc_to_dev(&dpriv->hdlc);
+		struct net_device *dev = hdlc_to_dev(dpriv->hdlc);
 
 		printk(KERN_INFO "%s: loopback requires clock\n", dev->name);
 		return -1;
@@ -1015,7 +1019,7 @@
 static int dscc4_open(struct net_device *dev)
 {
 	struct dscc4_dev_priv *dpriv = dscc4_priv(dev);
-	hdlc_device *hdlc = &dpriv->hdlc;
+	hdlc_device *hdlc = dpriv->hdlc;
 	struct dscc4_pci_priv *ppriv;
 	int ret = -EAGAIN;
 
@@ -1467,7 +1471,7 @@
 	int i, handled = 1;
 
 	priv = root->pci_priv;
-	dev = hdlc_to_dev(&root->hdlc);
+	dev = hdlc_to_dev(root->hdlc);
 
 	spin_lock_irqsave(&priv->lock, flags);
 
@@ -1518,7 +1522,7 @@
 static inline void dscc4_tx_irq(struct dscc4_pci_priv *ppriv,
 				struct dscc4_dev_priv *dpriv)
 {
-	struct net_device *dev = hdlc_to_dev(&dpriv->hdlc);
+	struct net_device *dev = hdlc_to_dev(dpriv->hdlc);
 	u32 state;
 	int cur, loop = 0;
 
@@ -1549,7 +1553,7 @@
 
 	if (state & SccEvt) {
 		if (state & Alls) {
-			struct net_device_stats *stats = &dpriv->hdlc.stats;
+			struct net_device_stats *stats = &dpriv->hdlc->stats;
 			struct sk_buff *skb;
 			struct TxFD *tx_fd;
 
@@ -1687,7 +1691,7 @@
 static inline void dscc4_rx_irq(struct dscc4_pci_priv *priv,
 				    struct dscc4_dev_priv *dpriv)
 {
-	struct net_device *dev = hdlc_to_dev(&dpriv->hdlc);
+	struct net_device *dev = hdlc_to_dev(dpriv->hdlc);
 	u32 state;
 	int cur;
 
@@ -1954,23 +1958,21 @@
 static void __devexit dscc4_remove_one(struct pci_dev *pdev)
 {
 	struct dscc4_pci_priv *ppriv;
-	struct dscc4_dev_priv *root;
+	struct dscc4_dev_priv *root,  *dpriv;
 	unsigned long ioaddr;
-	int i;
 
 	ppriv = pci_get_drvdata(pdev);
-	root = ppriv->root;
+	root = dscc4_root_priv(ppriv);
 
-	ioaddr = hdlc_to_dev(&root->hdlc)->base_addr;
+	ioaddr = hdlc_to_dev(root->hdlc)->base_addr;
 
 	dscc4_pci_reset(pdev, ioaddr);
 
 	free_irq(pdev->irq, root);
 	pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), ppriv->iqcfg,
 			    ppriv->iqcfg_dma);
-	for (i = 0; i < dev_per_card; i++) {
-		struct dscc4_dev_priv *dpriv = root + i;
 
+	list_for_each_entry(dpriv, &ppriv->devs, dev_list) {
 		dscc4_release_ring(dpriv);
 		pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32),
 				    dpriv->iqrx, dpriv->iqrx_dma);

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-12-02 22:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-12-02 22:01 [PATCH] (4//8) dscc4 convert to new hdlc_device Stephen Hemminger
  -- strict thread matches above, loose matches on Subject: below --
2003-12-02 21:58 Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).