1 #include <linux/module.h>
2 #include <linux/kernel.h>
3 #include <linux/proc_fs.h>
4 #include <linux/netdevice.h>
7 #include "ft1000_usb.h"
9 #define FT1000_PROC_DIR "ft1000"
12 #define PUTM_TO_PAGE(len,page,args...) \
13 len += snprintf(page+len, PAGE_SIZE - len, args)
15 #define PUTX_TO_PAGE(len,page,message,size,var) \
16 len += snprintf(page+len, PAGE_SIZE - len, message); \
17 for(i = 0; i < (size - 1); i++) \
19 len += snprintf(page+len, PAGE_SIZE - len, "%02x:", var[i]); \
21 len += snprintf(page+len, PAGE_SIZE - len, "%02x\n", var[i])
23 #define PUTD_TO_PAGE(len,page,message,size,var) \
24 len += snprintf(page+len, PAGE_SIZE - len, message); \
25 for(i = 0; i < (size - 1); i++) \
27 len += snprintf(page+len, PAGE_SIZE - len, "%d.", var[i]); \
29 len += snprintf(page+len, PAGE_SIZE - len, "%d\n", var[i])
35 #define FTNET_PROC init_net.proc_net
37 //#define FTNET_PROC proc_net
41 u16
ft1000_read_dpram16 (struct ft1000_device
*ft1000dev
, USHORT indx
,
42 PUCHAR buffer
, u8 highlow
);
46 ft1000ReadProc (char *page
, char **start
, off_t off
, int count
, int *eof
,
49 struct net_device
*dev
;
52 unsigned short ledStat
;
53 unsigned short conStat
;
57 char *status
[] = { "Idle (Disconnect)", "Searching", "Active (Connected)",
58 "Waiting for L2", "Sleep", "No Coverage", "", ""
61 char *signal
[] = { "", "*", "**", "***", "****" };
67 dev
= (struct net_device
*) data
;
68 info
= (FT1000_INFO
*) netdev_priv (dev
);
77 if (info
->ProgConStat
!= 0xFF)
79 ft1000_read_dpram16 (info
->pFt1000Dev
, FT1000_MAG_DSP_LED
,
80 (PUCHAR
) & ledStat
, FT1000_MAG_DSP_LED_INDX
);
81 info
->LedStat
= ntohs (ledStat
);
83 ft1000_read_dpram16 (info
->pFt1000Dev
, FT1000_MAG_DSP_CON_STATE
,
84 (PUCHAR
) & conStat
, FT1000_MAG_DSP_CON_STATE_INDX
);
85 info
->ConStat
= ntohs (conStat
);
86 do_gettimeofday (&tv
);
87 delta
= (tv
.tv_sec
- info
->ConTm
);
97 i
= (info
->LedStat
) & 0xf;
116 i
= (info
->LedStat
>> 8) & 0xf;
137 PUTM_TO_PAGE (len
, page
, "Connection Time: %02ld:%02ld:%02ld\n",
138 ((delta
/ 3600) % 24), ((delta
/ 60) % 60), (delta
% 60));
139 PUTM_TO_PAGE (len
, page
, "Connection Time[s]: %ld\n", delta
);
140 PUTM_TO_PAGE (len
, page
, "Asic ID: %s\n",
142 ELECTRABUZZ_ID
? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC");
143 PUTX_TO_PAGE (len
, page
, "SKU: ", SKUSZ
, info
->Sku
);
144 PUTX_TO_PAGE (len
, page
, "EUI64: ", EUISZ
, info
->eui64
);
145 PUTD_TO_PAGE (len
, page
, "DSP version number: ", DSPVERSZ
, info
->DspVer
);
146 PUTX_TO_PAGE (len
, page
, "Hardware Serial Number: ", HWSERNUMSZ
,
148 PUTX_TO_PAGE (len
, page
, "Caliberation Version: ", CALVERSZ
,
150 PUTD_TO_PAGE (len
, page
, "Caliberation Date: ", CALDATESZ
, info
->RfCalDate
);
151 PUTM_TO_PAGE (len
, page
, "Media State: %s\n",
152 (info
->mediastate
) ? "link" : "no link");
153 PUTM_TO_PAGE (len
, page
, "Connection Status: %s\n",
154 status
[((info
->ConStat
) & 0x7)]);
155 PUTM_TO_PAGE (len
, page
, "RX packets: %ld\n", info
->stats
.rx_packets
);
156 PUTM_TO_PAGE (len
, page
, "TX packets: %ld\n", info
->stats
.tx_packets
);
157 PUTM_TO_PAGE (len
, page
, "RX bytes: %ld\n", info
->stats
.rx_bytes
);
158 PUTM_TO_PAGE (len
, page
, "TX bytes: %ld\n", info
->stats
.tx_bytes
);
159 PUTM_TO_PAGE (len
, page
, "Signal Strength: %s\n", signal
[strength
]);
160 PUTM_TO_PAGE (len
, page
, "Signal Quality: %s\n", signal
[quality
]);
169 ft1000NotifyProc (struct notifier_block
*this, unsigned long event
, void *ptr
)
171 struct net_device
*dev
= ptr
;
173 struct proc_dir_entry
*ft1000_proc_file
;
175 info
= (FT1000_INFO
*) netdev_priv (dev
);
180 case NETDEV_CHANGENAME
:
181 remove_proc_entry (info
->netdevname
, info
->ft1000_proc_dir
);
182 ft1000_proc_file
= create_proc_read_entry (dev
->name
, 0644,
183 info
->ft1000_proc_dir
,
184 ft1000ReadProc
, dev
);
185 snprintf (info
->netdevname
, IFNAMSIZ
, "%s", dev
->name
);
191 static struct notifier_block ft1000_netdev_notifier
= {
192 .notifier_call
= ft1000NotifyProc
197 ft1000InitProc (struct net_device
*dev
)
200 struct proc_dir_entry
*ft1000_proc_file
;
201 info
= (FT1000_INFO
*) netdev_priv (dev
);
204 info
->ft1000_proc_dir
= proc_mkdir (FT1000_PROC_DIR
, FTNET_PROC
);
205 if (info
->ft1000_proc_dir
== NULL
)
207 remove_proc_entry (FT1000_PROC_DIR
, FTNET_PROC
);
212 create_proc_read_entry (dev
->name
, 0644, info
->ft1000_proc_dir
,
213 ft1000ReadProc
, dev
);
214 if (ft1000_proc_file
== NULL
)
216 remove_proc_entry (info
->netdevname
, info
->ft1000_proc_dir
);
219 snprintf (info
->netdevname
, IFNAMSIZ
, "%s", dev
->name
);
220 register_netdevice_notifier (&ft1000_netdev_notifier
);
225 ft1000CleanupProc (FT1000_INFO
* info
)
227 remove_proc_entry (info
->netdevname
, info
->ft1000_proc_dir
);
228 remove_proc_entry (FT1000_PROC_DIR
, FTNET_PROC
);
229 unregister_netdevice_notifier (&ft1000_netdev_notifier
);