Lines Matching defs:i2400m
9 * See i2400m.h for driver documentation. This contains helpers for
29 * i2400m->bus_setup()
37 * i2400m->bus_dev_start()
45 * i2400m->bus_dev_stop()
47 * i2400m->bus_release()
51 #include "i2400m.h"
53 #include <linux/wimax/i2400m.h>
92 * For the i2400m, this is an L3L4 message, as specified in
93 * include/linux/wimax/i2400m.h, and thus prefixed with a 'struct
101 * In the i2400m, messages are basically commands that will carry an
117 struct i2400m *i2400m = wimax_dev_to_i2400m(wimax_dev);
118 struct device *dev = i2400m_dev(i2400m);
121 d_fnstart(4, dev, "(wimax_dev %p [i2400m %p] msg_buf %p "
122 "msg_len %zu genl_info %p)\n", wimax_dev, i2400m,
124 ack_skb = i2400m_msg_to_dev(i2400m, msg_buf, msg_len);
128 result = wimax_msg_send(&i2400m->wimax_dev, ack_skb);
130 d_fnend(4, dev, "(wimax_dev %p [i2400m %p] msg_buf %p msg_len %zu "
131 "genl_info %p) = %d\n", wimax_dev, i2400m, msg_buf, msg_len,
166 struct i2400m *i2400m = wimax_dev_to_i2400m(wimax_dev);
167 struct device *dev = i2400m_dev(i2400m);
174 mutex_lock(&i2400m->init_mutex);
175 i2400m->reset_ctx = &ctx;
176 mutex_unlock(&i2400m->init_mutex);
177 result = i2400m_reset(i2400m, I2400M_RT_WARM);
186 mutex_lock(&i2400m->init_mutex);
187 i2400m->reset_ctx = NULL;
188 mutex_unlock(&i2400m->init_mutex);
198 * @i2400m: device descriptor
203 int i2400m_check_mac_addr(struct i2400m *i2400m)
206 struct device *dev = i2400m_dev(i2400m);
209 struct net_device *net_dev = i2400m->wimax_dev.net_dev;
211 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
212 skb = i2400m_get_device_info(i2400m);
244 d_fnend(3, dev, "(i2400m %p) = %d\n", i2400m, result);
252 * @i2400m: device descriptor
269 int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags)
272 struct wimax_dev *wimax_dev = &i2400m->wimax_dev;
274 struct device *dev = i2400m_dev(i2400m);
275 int times = i2400m->bus_bm_retries;
277 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
279 result = i2400m_dev_bootstrap(i2400m, flags);
284 result = i2400m_tx_setup(i2400m);
287 result = i2400m_rx_setup(i2400m);
290 i2400m->work_queue = create_singlethread_workqueue(wimax_dev->name);
291 if (i2400m->work_queue == NULL) {
296 if (i2400m->bus_dev_start) {
297 result = i2400m->bus_dev_start(i2400m);
301 i2400m->ready = 1;
302 wmb(); /* see i2400m->ready's documentation */
304 queue_work(i2400m->work_queue, &i2400m->rx_report_ws);
305 result = i2400m_firmware_check(i2400m); /* fw versions ok? */
309 result = i2400m_check_mac_addr(i2400m);
312 result = i2400m_dev_initialize(i2400m);
318 * here, let's keep i2400m->error_recovery untouched and leave it to
321 atomic_dec(&i2400m->error_recovery);
327 d_fnend(3, dev, "(net_dev %p [i2400m %p]) = %d\n",
328 net_dev, i2400m, result);
334 i2400m->ready = 0;
335 wmb(); /* see i2400m->ready's documentation */
336 flush_workqueue(i2400m->work_queue);
337 if (i2400m->bus_dev_stop)
338 i2400m->bus_dev_stop(i2400m);
340 destroy_workqueue(i2400m->work_queue);
342 i2400m_rx_release(i2400m);
344 i2400m_tx_release(i2400m);
351 d_fnend(3, dev, "(net_dev %p [i2400m %p]) = %d\n",
352 net_dev, i2400m, result);
358 int i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri bm_flags)
361 mutex_lock(&i2400m->init_mutex); /* Well, start the device */
362 if (i2400m->updown == 0) {
363 result = __i2400m_dev_start(i2400m, bm_flags);
365 i2400m->updown = 1;
366 i2400m->alive = 1;
367 wmb();/* see i2400m->updown and i2400m->alive's doc */
370 mutex_unlock(&i2400m->init_mutex);
378 * @i2400m: device descriptor
387 void __i2400m_dev_stop(struct i2400m *i2400m)
389 struct wimax_dev *wimax_dev = &i2400m->wimax_dev;
390 struct device *dev = i2400m_dev(i2400m);
392 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
394 i2400m_msg_to_dev_cancel_wait(i2400m, -EL3RST);
395 complete(&i2400m->msg_completion);
396 i2400m_net_wake_stop(i2400m);
397 i2400m_dev_shutdown(i2400m);
402 i2400m->ready = 0; /* nobody can queue work anymore */
403 wmb(); /* see i2400m->ready's documentation */
404 flush_workqueue(i2400m->work_queue);
406 if (i2400m->bus_dev_stop)
407 i2400m->bus_dev_stop(i2400m);
408 destroy_workqueue(i2400m->work_queue);
409 i2400m_rx_release(i2400m);
410 i2400m_tx_release(i2400m);
412 d_fnend(3, dev, "(i2400m %p) = 0\n", i2400m);
422 void i2400m_dev_stop(struct i2400m *i2400m)
424 mutex_lock(&i2400m->init_mutex);
425 if (i2400m->updown) {
426 __i2400m_dev_stop(i2400m);
427 i2400m->updown = 0;
428 i2400m->alive = 0;
429 wmb(); /* see i2400m->updown and i2400m->alive's doc */
431 mutex_unlock(&i2400m->init_mutex);
453 struct i2400m *i2400m =
454 container_of(notifier, struct i2400m, pm_notifier);
455 struct device *dev = i2400m_dev(i2400m);
457 d_fnstart(3, dev, "(i2400m %p pm_event %lx)\n", i2400m, pm_event);
461 i2400m_fw_cache(i2400m);
468 i2400m_fw_uncache(i2400m);
475 d_fnend(3, dev, "(i2400m %p pm_event %lx) = void\n", i2400m, pm_event);
486 int i2400m_pre_reset(struct i2400m *i2400m)
488 struct device *dev = i2400m_dev(i2400m);
490 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
493 mutex_lock(&i2400m->init_mutex);
494 if (i2400m->updown) {
495 netif_tx_disable(i2400m->wimax_dev.net_dev);
496 __i2400m_dev_stop(i2400m);
500 mutex_unlock(&i2400m->init_mutex);
501 if (i2400m->bus_release)
502 i2400m->bus_release(i2400m);
503 d_fnend(3, dev, "(i2400m %p) = 0\n", i2400m);
515 * NOTE: this requires i2400m->init_mutex taken
517 int i2400m_post_reset(struct i2400m *i2400m)
520 struct device *dev = i2400m_dev(i2400m);
522 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
524 if (i2400m->bus_setup) {
525 result = i2400m->bus_setup(i2400m);
532 mutex_lock(&i2400m->init_mutex);
533 if (i2400m->updown) {
535 i2400m, I2400M_BRI_SOFT | I2400M_BRI_MAC_REINIT);
539 mutex_unlock(&i2400m->init_mutex);
540 d_fnend(3, dev, "(i2400m %p) = %d\n", i2400m, result);
544 if (i2400m->bus_release)
545 i2400m->bus_release(i2400m);
548 i2400m->updown = 0;
549 wmb(); /* see i2400m->updown's documentation */
550 mutex_unlock(&i2400m->init_mutex);
552 d_fnend(3, dev, "(i2400m %p) = %d\n", i2400m, result);
584 struct i2400m *i2400m = container_of(ws, struct i2400m, reset_ws);
585 const char *reason = i2400m->reset_reason;
586 struct device *dev = i2400m_dev(i2400m);
587 struct i2400m_reset_ctx *ctx = i2400m->reset_ctx;
590 d_fnstart(3, dev, "(ws %p i2400m %p reason %s)\n", ws, i2400m, reason);
592 i2400m->boot_mode = 1;
596 if (mutex_trylock(&i2400m->init_mutex) == 0) {
601 i2400m_msg_to_dev_cancel_wait(i2400m, -EL3RST);
602 complete(&i2400m->msg_completion);
608 if (i2400m->updown) {
609 __i2400m_dev_stop(i2400m);
610 i2400m->updown = 0;
611 wmb(); /* see i2400m->updown's documentation */
614 if (i2400m->alive) {
615 result = __i2400m_dev_start(i2400m,
621 if (atomic_read(&i2400m->bus_reset_retries)
630 if (i2400m->reset_ctx) {
634 mutex_unlock(&i2400m->init_mutex);
644 i2400m->boot_mode = 0;
647 atomic_inc(&i2400m->bus_reset_retries);
649 result = i2400m_reset(i2400m, I2400M_RT_BUS);
654 if (i2400m->alive) {
657 i2400m->updown = 1;
659 atomic_set(&i2400m->bus_reset_retries, 0);
663 d_fnend(3, dev, "(ws %p i2400m %p reason %s) = void\n",
664 ws, i2400m, reason);
672 * is safe to call from atomic context. We can't use the i2400m's
680 int i2400m_dev_reset_handle(struct i2400m *i2400m, const char *reason)
682 i2400m->reset_reason = reason;
683 return schedule_work(&i2400m->reset_ws);
696 struct i2400m *i2400m = container_of(ws, struct i2400m, recovery_ws);
698 i2400m_reset(i2400m, I2400M_RT_BUS);
726 void i2400m_error_recovery(struct i2400m *i2400m)
728 if (atomic_add_return(1, &i2400m->error_recovery) == 1)
729 schedule_work(&i2400m->recovery_ws);
731 atomic_dec(&i2400m->error_recovery);
741 int i2400m_bm_buf_alloc(struct i2400m *i2400m)
743 i2400m->bm_cmd_buf = kzalloc(I2400M_BM_CMD_BUF_SIZE, GFP_KERNEL);
744 if (i2400m->bm_cmd_buf == NULL)
746 i2400m->bm_ack_buf = kzalloc(I2400M_BM_ACK_BUF_SIZE, GFP_KERNEL);
747 if (i2400m->bm_ack_buf == NULL)
752 kfree(i2400m->bm_cmd_buf);
762 void i2400m_bm_buf_free(struct i2400m *i2400m)
764 kfree(i2400m->bm_ack_buf);
765 kfree(i2400m->bm_cmd_buf);
770 * i2400m_init - Initialize a 'struct i2400m' from all zeroes
774 void i2400m_init(struct i2400m *i2400m)
776 wimax_dev_init(&i2400m->wimax_dev);
778 i2400m->boot_mode = 1;
779 i2400m->rx_reorder = 1;
780 init_waitqueue_head(&i2400m->state_wq);
782 spin_lock_init(&i2400m->tx_lock);
783 i2400m->tx_pl_min = UINT_MAX;
784 i2400m->tx_size_min = UINT_MAX;
786 spin_lock_init(&i2400m->rx_lock);
787 i2400m->rx_pl_min = UINT_MAX;
788 i2400m->rx_size_min = UINT_MAX;
789 INIT_LIST_HEAD(&i2400m->rx_reports);
790 INIT_WORK(&i2400m->rx_report_ws, i2400m_report_hook_work);
792 mutex_init(&i2400m->msg_mutex);
793 init_completion(&i2400m->msg_completion);
795 mutex_init(&i2400m->init_mutex);
798 INIT_WORK(&i2400m->reset_ws, __i2400m_dev_reset_handle);
799 INIT_WORK(&i2400m->recovery_ws, __i2400m_error_recovery);
801 atomic_set(&i2400m->bus_reset_retries, 0);
803 i2400m->alive = 0;
807 atomic_set(&i2400m->error_recovery, 1);
812 int i2400m_reset(struct i2400m *i2400m, enum i2400m_reset_type rt)
814 struct net_device *net_dev = i2400m->wimax_dev.net_dev;
825 return i2400m->bus_reset(i2400m, rt);
831 * i2400m_setup - bus-generic setup function for the i2400m device
833 * @i2400m: device descriptor (bus-specific parts have been initialized)
841 int i2400m_setup(struct i2400m *i2400m, enum i2400m_bri bm_flags)
844 struct device *dev = i2400m_dev(i2400m);
845 struct wimax_dev *wimax_dev = &i2400m->wimax_dev;
846 struct net_device *net_dev = i2400m->wimax_dev.net_dev;
848 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
851 "i2400m-%s:%s", dev->bus->name, dev_name(dev));
853 result = i2400m_bm_buf_alloc(i2400m);
859 if (i2400m->bus_setup) {
860 result = i2400m->bus_setup(i2400m);
868 result = i2400m_bootrom_init(i2400m, bm_flags);
874 result = i2400m_read_mac_addr(i2400m);
877 eth_random_addr(i2400m->src_mac_addr);
879 i2400m->pm_notifier.notifier_call = i2400m_pm_notifier;
880 register_pm_notifier(&i2400m->pm_notifier);
884 dev_err(dev, "cannot register i2400m network device: %d\n",
890 i2400m->wimax_dev.op_msg_from_user = i2400m_op_msg_from_user;
891 i2400m->wimax_dev.op_rfkill_sw_toggle = i2400m_op_rfkill_sw_toggle;
892 i2400m->wimax_dev.op_reset = i2400m_op_reset;
894 result = wimax_dev_add(&i2400m->wimax_dev, net_dev);
901 dev_err(dev, "cannot setup i2400m's sysfs: %d\n", result);
905 i2400m_debugfs_add(i2400m);
907 result = i2400m_dev_start(i2400m, bm_flags);
910 d_fnend(3, dev, "(i2400m %p) = %d\n", i2400m, result);
914 i2400m_debugfs_rm(i2400m);
915 sysfs_remove_group(&i2400m->wimax_dev.net_dev->dev.kobj,
918 wimax_dev_rm(&i2400m->wimax_dev);
922 unregister_pm_notifier(&i2400m->pm_notifier);
925 if (i2400m->bus_release)
926 i2400m->bus_release(i2400m);
928 i2400m_bm_buf_free(i2400m);
930 d_fnend(3, dev, "(i2400m %p) = %d\n", i2400m, result);
941 void i2400m_release(struct i2400m *i2400m)
943 struct device *dev = i2400m_dev(i2400m);
945 d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
946 netif_stop_queue(i2400m->wimax_dev.net_dev);
948 i2400m_dev_stop(i2400m);
950 cancel_work_sync(&i2400m->reset_ws);
951 cancel_work_sync(&i2400m->recovery_ws);
953 i2400m_debugfs_rm(i2400m);
954 sysfs_remove_group(&i2400m->wimax_dev.net_dev->dev.kobj,
956 wimax_dev_rm(&i2400m->wimax_dev);
957 unregister_netdev(i2400m->wimax_dev.net_dev);
958 unregister_pm_notifier(&i2400m->pm_notifier);
959 if (i2400m->bus_release)
960 i2400m->bus_release(i2400m);
961 i2400m_bm_buf_free(i2400m);
962 d_fnend(3, dev, "(i2400m %p) = void\n", i2400m);
988 "i2400m.debug");