caif_dev.c (daab7fc734a53fdeaf844b7c03053118ad1769da) caif_dev.c (b31fa5bad576cd8180a5ad70c648333b44320d44)
1/*
2 * CAIF Interface registration.
3 * Copyright (C) ST-Ericsson AB 2010
4 * Author: Sjur Brendeland/sjur.brandeland@stericsson.com
5 * License terms: GNU General Public License (GPL) version 2
6 *
7 * Borrowed heavily from file: pn_dev.c. Thanks to
8 * Remi Denis-Courmont <remi.denis-courmont@nokia.com>
9 * and Sakari Ailus <sakari.ailus@nokia.com>
10 */
11
1/*
2 * CAIF Interface registration.
3 * Copyright (C) ST-Ericsson AB 2010
4 * Author: Sjur Brendeland/sjur.brandeland@stericsson.com
5 * License terms: GNU General Public License (GPL) version 2
6 *
7 * Borrowed heavily from file: pn_dev.c. Thanks to
8 * Remi Denis-Courmont <remi.denis-courmont@nokia.com>
9 * and Sakari Ailus <sakari.ailus@nokia.com>
10 */
11
12#define pr_fmt(fmt) KBUILD_MODNAME ":%s(): " fmt, __func__
13
12#include <linux/version.h>
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/if_arp.h>
16#include <linux/net.h>
17#include <linux/netdevice.h>
18#include <linux/skbuff.h>
19#include <linux/sched.h>

--- 189 unchanged lines hidden (view full) ---

209 int res = -EINVAL;
210 enum cfcnfg_phy_type phy_type;
211
212 if (dev->type != ARPHRD_CAIF)
213 return 0;
214
215 switch (what) {
216 case NETDEV_REGISTER:
14#include <linux/version.h>
15#include <linux/module.h>
16#include <linux/kernel.h>
17#include <linux/if_arp.h>
18#include <linux/net.h>
19#include <linux/netdevice.h>
20#include <linux/skbuff.h>
21#include <linux/sched.h>

--- 189 unchanged lines hidden (view full) ---

211 int res = -EINVAL;
212 enum cfcnfg_phy_type phy_type;
213
214 if (dev->type != ARPHRD_CAIF)
215 return 0;
216
217 switch (what) {
218 case NETDEV_REGISTER:
217 pr_info("CAIF: %s():register %s\n", __func__, dev->name);
219 pr_info("register %s\n", dev->name);
218 caifd = caif_device_alloc(dev);
219 if (caifd == NULL)
220 break;
221 caifdev = netdev_priv(dev);
222 caifdev->flowctrl = dev_flowctrl;
223 atomic_set(&caifd->state, what);
224 res = 0;
225 break;
226
227 case NETDEV_UP:
220 caifd = caif_device_alloc(dev);
221 if (caifd == NULL)
222 break;
223 caifdev = netdev_priv(dev);
224 caifdev->flowctrl = dev_flowctrl;
225 atomic_set(&caifd->state, what);
226 res = 0;
227 break;
228
229 case NETDEV_UP:
228 pr_info("CAIF: %s(): up %s\n", __func__, dev->name);
230 pr_info("up %s\n", dev->name);
229 caifd = caif_get(dev);
230 if (caifd == NULL)
231 break;
232 caifdev = netdev_priv(dev);
233 if (atomic_read(&caifd->state) == NETDEV_UP) {
231 caifd = caif_get(dev);
232 if (caifd == NULL)
233 break;
234 caifdev = netdev_priv(dev);
235 if (atomic_read(&caifd->state) == NETDEV_UP) {
234 pr_info("CAIF: %s():%s already up\n",
235 __func__, dev->name);
236 pr_info("%s already up\n", dev->name);
236 break;
237 }
238 atomic_set(&caifd->state, what);
239 caifd->layer.transmit = transmit;
240 caifd->layer.modemcmd = modemcmd;
241
242 if (caifdev->use_frag)
243 phy_type = CFPHYTYPE_FRAG;

--- 24 unchanged lines hidden (view full) ---

268 sizeof(caifd->layer.name) - 1);
269 caifd->layer.name[sizeof(caifd->layer.name) - 1] = 0;
270 break;
271
272 case NETDEV_GOING_DOWN:
273 caifd = caif_get(dev);
274 if (caifd == NULL)
275 break;
237 break;
238 }
239 atomic_set(&caifd->state, what);
240 caifd->layer.transmit = transmit;
241 caifd->layer.modemcmd = modemcmd;
242
243 if (caifdev->use_frag)
244 phy_type = CFPHYTYPE_FRAG;

--- 24 unchanged lines hidden (view full) ---

269 sizeof(caifd->layer.name) - 1);
270 caifd->layer.name[sizeof(caifd->layer.name) - 1] = 0;
271 break;
272
273 case NETDEV_GOING_DOWN:
274 caifd = caif_get(dev);
275 if (caifd == NULL)
276 break;
276 pr_info("CAIF: %s():going down %s\n", __func__, dev->name);
277 pr_info("going down %s\n", dev->name);
277
278 if (atomic_read(&caifd->state) == NETDEV_GOING_DOWN ||
279 atomic_read(&caifd->state) == NETDEV_DOWN)
280 break;
281
282 atomic_set(&caifd->state, what);
283 if (!caifd || !caifd->layer.up || !caifd->layer.up->ctrlcmd)
284 return -EINVAL;

--- 5 unchanged lines hidden (view full) ---

290 atomic_read(&caifd->in_use) == 0,
291 TIMEOUT);
292 break;
293
294 case NETDEV_DOWN:
295 caifd = caif_get(dev);
296 if (caifd == NULL)
297 break;
278
279 if (atomic_read(&caifd->state) == NETDEV_GOING_DOWN ||
280 atomic_read(&caifd->state) == NETDEV_DOWN)
281 break;
282
283 atomic_set(&caifd->state, what);
284 if (!caifd || !caifd->layer.up || !caifd->layer.up->ctrlcmd)
285 return -EINVAL;

--- 5 unchanged lines hidden (view full) ---

291 atomic_read(&caifd->in_use) == 0,
292 TIMEOUT);
293 break;
294
295 case NETDEV_DOWN:
296 caifd = caif_get(dev);
297 if (caifd == NULL)
298 break;
298 pr_info("CAIF: %s(): down %s\n", __func__, dev->name);
299 pr_info("down %s\n", dev->name);
299 if (atomic_read(&caifd->in_use))
300 if (atomic_read(&caifd->in_use))
300 pr_warning("CAIF: %s(): "
301 "Unregistering an active CAIF device: %s\n",
302 __func__, dev->name);
301 pr_warn("Unregistering an active CAIF device: %s\n",
302 dev->name);
303 cfcnfg_del_phy_layer(get_caif_conf(), &caifd->layer);
304 dev_put(dev);
305 atomic_set(&caifd->state, what);
306 break;
307
308 case NETDEV_UNREGISTER:
309 caifd = caif_get(dev);
303 cfcnfg_del_phy_layer(get_caif_conf(), &caifd->layer);
304 dev_put(dev);
305 atomic_set(&caifd->state, what);
306 break;
307
308 case NETDEV_UNREGISTER:
309 caifd = caif_get(dev);
310 pr_info("CAIF: %s(): unregister %s\n", __func__, dev->name);
310 pr_info("unregister %s\n", dev->name);
311 atomic_set(&caifd->state, what);
312 caif_device_destroy(dev);
313 break;
314 }
315 return 0;
316}
317
318static struct notifier_block caif_device_notifier = {

--- 67 unchanged lines hidden (view full) ---

386};
387
388/* Initialize Caif devices list */
389static int __init caif_device_init(void)
390{
391 int result;
392 cfg = cfcnfg_create();
393 if (!cfg) {
311 atomic_set(&caifd->state, what);
312 caif_device_destroy(dev);
313 break;
314 }
315 return 0;
316}
317
318static struct notifier_block caif_device_notifier = {

--- 67 unchanged lines hidden (view full) ---

386};
387
388/* Initialize Caif devices list */
389static int __init caif_device_init(void)
390{
391 int result;
392 cfg = cfcnfg_create();
393 if (!cfg) {
394 pr_warning("CAIF: %s(): can't create cfcnfg.\n", __func__);
394 pr_warn("can't create cfcnfg\n");
395 goto err_cfcnfg_create_failed;
396 }
397 result = register_pernet_device(&caif_net_ops);
398
399 if (result) {
400 kfree(cfg);
401 cfg = NULL;
402 return result;

--- 19 unchanged lines hidden ---
395 goto err_cfcnfg_create_failed;
396 }
397 result = register_pernet_device(&caif_net_ops);
398
399 if (result) {
400 kfree(cfg);
401 cfg = NULL;
402 return result;

--- 19 unchanged lines hidden ---