Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fjes: platform_driver's .probe and .remove routine

This patch implements platform_driver's .probe and .remove
routine, and also adds board specific private data structure.

This driver registers net_device at platform_driver's .probe
routine and unregisters net_device at its .remove routine.

Signed-off-by: Taku Izumi <izumi.taku@jp.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Taku Izumi and committed by
David S. Miller
2fcbca68 a18aaec2

+119
+25
drivers/net/fjes/fjes.h
··· 24 24 25 25 #include <linux/acpi.h> 26 26 27 + #include "fjes_hw.h" 28 + 27 29 #define FJES_ACPI_SYMBOL "Extended Socket" 30 + #define FJES_MAX_QUEUES 1 31 + #define FJES_TX_RETRY_INTERVAL (20 * HZ) 32 + 33 + /* board specific private data structure */ 34 + struct fjes_adapter { 35 + struct net_device *netdev; 36 + struct platform_device *plat_dev; 37 + 38 + struct napi_struct napi; 39 + struct rtnl_link_stats64 stats64; 40 + 41 + unsigned int tx_retry_count; 42 + unsigned long tx_start_jiffies; 43 + unsigned long rx_last_jiffies; 44 + bool unset_rx_last; 45 + 46 + bool force_reset; 47 + bool open_guard; 48 + 49 + bool irq_registered; 50 + 51 + struct fjes_hw hw; 52 + }; 28 53 29 54 extern char fjes_driver_name[]; 30 55 extern char fjes_driver_version[];
+94
drivers/net/fjes/fjes_main.c
··· 23 23 #include <linux/types.h> 24 24 #include <linux/nls.h> 25 25 #include <linux/platform_device.h> 26 + #include <linux/netdevice.h> 26 27 27 28 #include "fjes.h" 28 29 ··· 49 48 50 49 static int fjes_probe(struct platform_device *); 51 50 static int fjes_remove(struct platform_device *); 51 + 52 + static int fjes_sw_init(struct fjes_adapter *); 53 + static void fjes_netdev_setup(struct net_device *); 52 54 53 55 static const struct acpi_device_id fjes_acpi_ids[] = { 54 56 {"PNP0C02", 0}, ··· 170 166 return AE_OK; 171 167 } 172 168 169 + static const struct net_device_ops fjes_netdev_ops = { 170 + }; 171 + 173 172 /* fjes_probe - Device Initialization Routine */ 174 173 static int fjes_probe(struct platform_device *plat_dev) 175 174 { 175 + struct fjes_adapter *adapter; 176 + struct net_device *netdev; 177 + struct resource *res; 178 + struct fjes_hw *hw; 179 + int err; 180 + 181 + err = -ENOMEM; 182 + netdev = alloc_netdev_mq(sizeof(struct fjes_adapter), "es%d", 183 + NET_NAME_UNKNOWN, fjes_netdev_setup, 184 + FJES_MAX_QUEUES); 185 + 186 + if (!netdev) 187 + goto err_out; 188 + 189 + SET_NETDEV_DEV(netdev, &plat_dev->dev); 190 + 191 + dev_set_drvdata(&plat_dev->dev, netdev); 192 + adapter = netdev_priv(netdev); 193 + adapter->netdev = netdev; 194 + adapter->plat_dev = plat_dev; 195 + hw = &adapter->hw; 196 + hw->back = adapter; 197 + 198 + /* setup the private structure */ 199 + err = fjes_sw_init(adapter); 200 + if (err) 201 + goto err_free_netdev; 202 + 203 + adapter->force_reset = false; 204 + adapter->open_guard = false; 205 + 206 + res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0); 207 + hw->hw_res.start = res->start; 208 + hw->hw_res.size = res->end - res->start + 1; 209 + hw->hw_res.irq = platform_get_irq(plat_dev, 0); 210 + err = fjes_hw_init(&adapter->hw); 211 + if (err) 212 + goto err_free_netdev; 213 + 214 + /* setup MAC address (02:00:00:00:00:[epid])*/ 215 + netdev->dev_addr[0] = 2; 216 + netdev->dev_addr[1] = 0; 217 + netdev->dev_addr[2] = 0; 218 + netdev->dev_addr[3] = 0; 219 + netdev->dev_addr[4] = 0; 220 + netdev->dev_addr[5] = hw->my_epid; /* EPID */ 221 + 222 + err = register_netdev(netdev); 223 + if (err) 224 + goto err_hw_exit; 225 + 226 + netif_carrier_off(netdev); 227 + 176 228 return 0; 229 + 230 + err_hw_exit: 231 + fjes_hw_exit(&adapter->hw); 232 + err_free_netdev: 233 + free_netdev(netdev); 234 + err_out: 235 + return err; 177 236 } 178 237 179 238 /* fjes_remove - Device Removal Routine */ 180 239 static int fjes_remove(struct platform_device *plat_dev) 181 240 { 241 + struct net_device *netdev = dev_get_drvdata(&plat_dev->dev); 242 + struct fjes_adapter *adapter = netdev_priv(netdev); 243 + struct fjes_hw *hw = &adapter->hw; 244 + 245 + unregister_netdev(netdev); 246 + 247 + fjes_hw_exit(hw); 248 + 249 + free_netdev(netdev); 250 + 182 251 return 0; 252 + } 253 + 254 + static int fjes_sw_init(struct fjes_adapter *adapter) 255 + { 256 + return 0; 257 + } 258 + 259 + /* fjes_netdev_setup - netdevice initialization routine */ 260 + static void fjes_netdev_setup(struct net_device *netdev) 261 + { 262 + ether_setup(netdev); 263 + 264 + netdev->watchdog_timeo = FJES_TX_RETRY_INTERVAL; 265 + netdev->netdev_ops = &fjes_netdev_ops; 266 + netdev->mtu = fjes_support_mtu[0]; 267 + netdev->flags |= IFF_BROADCAST; 268 + netdev->features |= NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_FILTER; 183 269 } 184 270 185 271 /* fjes_init_module - Driver Registration Routine */