Move all /proc related functions into skproc.c and handle device
name changes.
Signed-off-by: Stephen Hemminger <shemminger@xxxxxxxx>
diff -Nru a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile
--- a/drivers/net/sk98lin/Makefile 2004-11-15 11:21:41 -08:00
+++ b/drivers/net/sk98lin/Makefile 2004-11-15 11:21:41 -08:00
@@ -27,8 +27,12 @@
sktimer.o \
skvpd.o \
skxmac2.o \
- skproc.o \
skcsum.o
+
+ifdef CONFIG_PROC_FS
+sk98lin-objs += skproc.o
+endif
+
# DBGDEF = \
# -DDEBUG
diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h
--- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:21:41 -08:00
+++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-15 11:21:41 -08:00
@@ -70,6 +70,19 @@
extern int SkDrvLeaveDiagMode(SK_AC *pAc);
#endif
+extern int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev);
+#ifdef CONFIG_PROC_FS
+extern struct proc_dir_entry *SkGeProcCreate(struct net_device *dev);
+extern void SkGeProcRemove(struct proc_dir_entry *pe);
+extern void SkGeProcInit(void);
+extern void SkGeProcExit(void);
+#else
+#define SkGeProcCreate(dev) (NULL)
+#define SkGeProcRemove(pe) do { } while(0)
+#define SkGeProcInit() do { } while(0)
+#define SkGeProcExit() do { } while(0)
+#endif
+
struct s_DrvRlmtMbuf {
SK_MBUF *pNext; /* Pointer to next RLMT Mbuf. */
SK_U8 *pData; /* Data buffer (virtually contig.). */
@@ -266,11 +279,12 @@
typedef struct s_DevNet DEV_NET;
struct s_DevNet {
+ SK_AC *pAC;
int PortNr;
int NetNr;
int Mtu;
int Up;
- SK_AC *pAC;
+ struct proc_dir_entry *proc;
};
typedef struct s_TxPort TX_PORT;
diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c
--- a/drivers/net/sk98lin/skge.c 2004-11-15 11:21:41 -08:00
+++ b/drivers/net/sk98lin/skge.c 2004-11-15 11:21:41 -08:00
@@ -199,7 +199,6 @@
static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs
*ptregs);
static int SkGeOpen(struct SK_NET_DEVICE *dev);
static int SkGeClose(struct SK_NET_DEVICE *dev);
-static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev);
static int SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p);
static void SkGeSetRxMode(struct SK_NET_DEVICE *dev);
static struct net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev);
@@ -234,27 +233,6 @@
* Extern Function Prototypes
*
******************************************************************************/
-static const char SKRootName[] = "sk98lin";
-static struct proc_dir_entry *pSkRootDir;
-extern struct file_operations sk_proc_fops;
-
-static inline void SkGeProcCreate(struct net_device *dev)
-{
- struct proc_dir_entry *pe;
-
- if (pSkRootDir &&
- (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) {
- pe->proc_fops = &sk_proc_fops;
- pe->data = dev;
- pe->owner = THIS_MODULE;
- }
-}
-
-static inline void SkGeProcRemove(struct net_device *dev)
-{
- if (pSkRootDir)
- remove_proc_entry(dev->name, pSkRootDir);
-}
extern void SkDimEnableModerationIfNeeded(SK_AC *pAC);
extern void SkDimDisplayModerationSettings(SK_AC *pAC);
@@ -1420,7 +1398,7 @@
* WARNING: returning 1 in 'tbusy' case caused system crashes (double
* allocated skb's) !!!
*/
-static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev)
+int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev)
{
DEV_NET *pNet;
SK_AC *pAC;
@@ -5004,7 +4982,7 @@
memcpy(&dev->dev_addr, &pAC->Addr.Net[0].CurrentMacAddress, 6);
- SkGeProcCreate(dev);
+ pNet->proc = SkGeProcCreate(dev);
pNet->PortNr = 0;
pNet->NetNr = 0;
@@ -5053,7 +5031,7 @@
free_netdev(dev);
pAC->dev[1] = pAC->dev[0];
} else {
- SkGeProcCreate(dev);
+ pNet->proc = SkGeProcCreate(dev);
memcpy(&dev->dev_addr,
&pAC->Addr.Net[1].CurrentMacAddress, 6);
@@ -5093,10 +5071,12 @@
SK_AC *pAC = pNet->pAC;
struct net_device *otherdev = pAC->dev[1];
- SkGeProcRemove(dev);
+ SkGeProcRemove(pNet->proc);
unregister_netdev(dev);
- if (otherdev != dev)
- SkGeProcRemove(otherdev);
+ if (otherdev != dev) {
+ DEV_NET *otherNet = netdev_priv(otherdev);
+ SkGeProcRemove(otherNet->proc);
+ }
SkGeYellowLED(pAC, pAC->IoBase, 0);
@@ -5163,21 +5143,18 @@
{
int error;
- pSkRootDir = proc_mkdir(SKRootName, proc_net);
- if (pSkRootDir)
- pSkRootDir->owner = THIS_MODULE;
+ SkGeProcInit();
error = pci_register_driver(&skge_driver);
if (error)
- proc_net_remove(SKRootName);
+ SkGeProcExit();
return error;
}
static void __exit skge_exit(void)
{
pci_unregister_driver(&skge_driver);
- proc_net_remove(SKRootName);
-
+ SkGeProcExit();
}
module_init(skge_init);
diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c
--- a/drivers/net/sk98lin/skproc.c 2004-11-15 11:21:41 -08:00
+++ b/drivers/net/sk98lin/skproc.c 2004-11-15 11:21:41 -08:00
@@ -31,10 +31,13 @@
#include "h/skdrv2nd.h"
#include "h/skversion.h"
+static const char SKRootName[] = "sk98lin";
+static struct proc_dir_entry *pSkRootDir;
+
static int sk_seq_show(struct seq_file *seq, void *v);
static int sk_proc_open(struct inode *inode, struct file *file);
-struct file_operations sk_proc_fops = {
+static struct file_operations sk_proc_fops = {
.owner = THIS_MODULE,
.open = sk_proc_open,
.read = seq_read,
@@ -258,8 +261,66 @@
return single_open(file, sk_seq_show, PDE(inode)->data);
}
-/*******************************************************************************
- *
- * End of file
- *
-
******************************************************************************/
+
+struct proc_dir_entry *SkGeProcCreate(struct net_device *dev)
+{
+ struct proc_dir_entry *pe = NULL;
+
+ if (pSkRootDir &&
+ (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) {
+ pe->proc_fops = &sk_proc_fops;
+ pe->data = dev;
+ pe->owner = THIS_MODULE;
+ }
+ return pe;
+}
+
+void SkGeProcRemove(struct proc_dir_entry *pe)
+{
+ char oldname[IFNAMSIZ];
+
+ if (pe) {
+ strlcpy(oldname, pe->name, IFNAMSIZ);
+ remove_proc_entry(oldname, pSkRootDir);
+ }
+}
+
+/* Callback about network device events.
+ * Only care if device is this driver and it is a name change
+ */
+static int skge_device_notifier(struct notifier_block *unused,
+ unsigned long event, void *ptr)
+{
+ struct net_device *dev = ptr;
+ DEV_NET *pNet = netdev_priv(dev);
+
+ if (event == NETDEV_CHANGENAME
+ && dev->hard_start_xmit == &SkGeXmit
+ && pNet->proc) {
+ SkGeProcRemove(pNet->proc);
+ pNet->proc = SkGeProcCreate(dev);
+ }
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block skge_dev_notifier = {
+ .notifier_call = skge_device_notifier,
+};
+
+void SkGeProcInit(void)
+{
+ pSkRootDir = proc_mkdir(SKRootName, proc_net);
+ if (pSkRootDir) {
+ pSkRootDir->owner = THIS_MODULE;
+ register_netdevice_notifier(&skge_dev_notifier);
+ }
+}
+
+void SkGeProcExit(void)
+{
+ if (pSkRootDir) {
+ proc_net_remove(SKRootName);
+ unregister_netdevice_notifier(&skge_dev_notifier);
+ }
+}
+
|