Lines Matching refs:card
171 lcs_free_card(struct lcs_card *card) in lcs_free_card() argument
174 LCS_DBF_HEX(2, setup, &card, sizeof(void*)); in lcs_free_card()
175 kfree(card); in lcs_free_card()
184 struct lcs_card *card; in lcs_alloc_card() local
189 card = kzalloc(sizeof(struct lcs_card), GFP_KERNEL | GFP_DMA); in lcs_alloc_card()
190 if (card == NULL) in lcs_alloc_card()
192 card->lan_type = LCS_FRAME_TYPE_AUTO; in lcs_alloc_card()
193 card->pkt_seq = 0; in lcs_alloc_card()
194 card->lancmd_timeout = LCS_LANCMD_TIMEOUT_DEFAULT; in lcs_alloc_card()
196 rc = lcs_alloc_channel(&card->read); in lcs_alloc_card()
199 lcs_free_card(card); in lcs_alloc_card()
203 rc = lcs_alloc_channel(&card->write); in lcs_alloc_card()
206 lcs_cleanup_channel(&card->read); in lcs_alloc_card()
207 lcs_free_card(card); in lcs_alloc_card()
212 INIT_LIST_HEAD(&card->ipm_list); in lcs_alloc_card()
214 LCS_DBF_HEX(2, setup, &card, sizeof(void*)); in lcs_alloc_card()
215 return card; in lcs_alloc_card()
222 lcs_setup_read_ccws(struct lcs_card *card) in lcs_setup_read_ccws() argument
228 memset(card->read.ccws, 0, sizeof (struct ccw1) * (LCS_NUM_BUFFS + 1)); in lcs_setup_read_ccws()
230 card->read.ccws[cnt].cmd_code = LCS_CCW_READ; in lcs_setup_read_ccws()
231 card->read.ccws[cnt].count = LCS_IOBUFFERSIZE; in lcs_setup_read_ccws()
232 card->read.ccws[cnt].flags = in lcs_setup_read_ccws()
238 card->read.ccws[cnt].cda = in lcs_setup_read_ccws()
239 (__u32) __pa(card->read.iob[cnt].data); in lcs_setup_read_ccws()
241 card->read.iob[cnt].data)->offset = LCS_ILLEGAL_OFFSET; in lcs_setup_read_ccws()
242 card->read.iob[cnt].callback = lcs_get_frames_cb; in lcs_setup_read_ccws()
243 card->read.iob[cnt].state = LCS_BUF_STATE_READY; in lcs_setup_read_ccws()
244 card->read.iob[cnt].count = LCS_IOBUFFERSIZE; in lcs_setup_read_ccws()
246 card->read.ccws[0].flags &= ~CCW_FLAG_PCI; in lcs_setup_read_ccws()
247 card->read.ccws[LCS_NUM_BUFFS - 1].flags &= ~CCW_FLAG_PCI; in lcs_setup_read_ccws()
248 card->read.ccws[LCS_NUM_BUFFS - 1].flags |= CCW_FLAG_SUSPEND; in lcs_setup_read_ccws()
250 card->read.ccws[LCS_NUM_BUFFS].cmd_code = LCS_CCW_TRANSFER; in lcs_setup_read_ccws()
251 card->read.ccws[LCS_NUM_BUFFS].cda = in lcs_setup_read_ccws()
252 (__u32) __pa(card->read.ccws); in lcs_setup_read_ccws()
254 card->read.state = LCS_CH_STATE_INIT; in lcs_setup_read_ccws()
256 card->read.io_idx = 0; in lcs_setup_read_ccws()
257 card->read.buf_idx = 0; in lcs_setup_read_ccws()
261 lcs_setup_read(struct lcs_card *card) in lcs_setup_read() argument
265 lcs_setup_read_ccws(card); in lcs_setup_read()
267 card->read.irq_tasklet.data = (unsigned long) &card->read; in lcs_setup_read()
268 card->read.irq_tasklet.func = lcs_tasklet; in lcs_setup_read()
270 init_waitqueue_head(&card->read.wait_q); in lcs_setup_read()
277 lcs_setup_write_ccws(struct lcs_card *card) in lcs_setup_write_ccws() argument
283 memset(card->write.ccws, 0, sizeof(struct ccw1) * (LCS_NUM_BUFFS + 1)); in lcs_setup_write_ccws()
285 card->write.ccws[cnt].cmd_code = LCS_CCW_WRITE; in lcs_setup_write_ccws()
286 card->write.ccws[cnt].count = 0; in lcs_setup_write_ccws()
287 card->write.ccws[cnt].flags = in lcs_setup_write_ccws()
293 card->write.ccws[cnt].cda = in lcs_setup_write_ccws()
294 (__u32) __pa(card->write.iob[cnt].data); in lcs_setup_write_ccws()
297 card->write.ccws[LCS_NUM_BUFFS].cmd_code = LCS_CCW_TRANSFER; in lcs_setup_write_ccws()
298 card->write.ccws[LCS_NUM_BUFFS].cda = in lcs_setup_write_ccws()
299 (__u32) __pa(card->write.ccws); in lcs_setup_write_ccws()
301 card->read.state = LCS_CH_STATE_INIT; in lcs_setup_write_ccws()
303 card->write.io_idx = 0; in lcs_setup_write_ccws()
304 card->write.buf_idx = 0; in lcs_setup_write_ccws()
308 lcs_setup_write(struct lcs_card *card) in lcs_setup_write() argument
312 lcs_setup_write_ccws(card); in lcs_setup_write()
314 card->write.irq_tasklet.data = (unsigned long) &card->write; in lcs_setup_write()
315 card->write.irq_tasklet.func = lcs_tasklet; in lcs_setup_write()
317 init_waitqueue_head(&card->write.wait_q); in lcs_setup_write()
321 lcs_set_allowed_threads(struct lcs_card *card, unsigned long threads) in lcs_set_allowed_threads() argument
325 spin_lock_irqsave(&card->mask_lock, flags); in lcs_set_allowed_threads()
326 card->thread_allowed_mask = threads; in lcs_set_allowed_threads()
327 spin_unlock_irqrestore(&card->mask_lock, flags); in lcs_set_allowed_threads()
328 wake_up(&card->wait_q); in lcs_set_allowed_threads()
331 lcs_threads_running(struct lcs_card *card, unsigned long threads) in lcs_threads_running() argument
336 spin_lock_irqsave(&card->mask_lock, flags); in lcs_threads_running()
337 rc = (card->thread_running_mask & threads); in lcs_threads_running()
338 spin_unlock_irqrestore(&card->mask_lock, flags); in lcs_threads_running()
343 lcs_wait_for_threads(struct lcs_card *card, unsigned long threads) in lcs_wait_for_threads() argument
345 return wait_event_interruptible(card->wait_q, in lcs_wait_for_threads()
346 lcs_threads_running(card, threads) == 0); in lcs_wait_for_threads()
350 lcs_set_thread_start_bit(struct lcs_card *card, unsigned long thread) in lcs_set_thread_start_bit() argument
354 spin_lock_irqsave(&card->mask_lock, flags); in lcs_set_thread_start_bit()
355 if ( !(card->thread_allowed_mask & thread) || in lcs_set_thread_start_bit()
356 (card->thread_start_mask & thread) ) { in lcs_set_thread_start_bit()
357 spin_unlock_irqrestore(&card->mask_lock, flags); in lcs_set_thread_start_bit()
360 card->thread_start_mask |= thread; in lcs_set_thread_start_bit()
361 spin_unlock_irqrestore(&card->mask_lock, flags); in lcs_set_thread_start_bit()
366 lcs_clear_thread_running_bit(struct lcs_card *card, unsigned long thread) in lcs_clear_thread_running_bit() argument
370 spin_lock_irqsave(&card->mask_lock, flags); in lcs_clear_thread_running_bit()
371 card->thread_running_mask &= ~thread; in lcs_clear_thread_running_bit()
372 spin_unlock_irqrestore(&card->mask_lock, flags); in lcs_clear_thread_running_bit()
373 wake_up(&card->wait_q); in lcs_clear_thread_running_bit()
377 __lcs_do_run_thread(struct lcs_card *card, unsigned long thread) in __lcs_do_run_thread() argument
382 spin_lock_irqsave(&card->mask_lock, flags); in __lcs_do_run_thread()
383 if (card->thread_start_mask & thread){ in __lcs_do_run_thread()
384 if ((card->thread_allowed_mask & thread) && in __lcs_do_run_thread()
385 !(card->thread_running_mask & thread)){ in __lcs_do_run_thread()
387 card->thread_start_mask &= ~thread; in __lcs_do_run_thread()
388 card->thread_running_mask |= thread; in __lcs_do_run_thread()
392 spin_unlock_irqrestore(&card->mask_lock, flags); in __lcs_do_run_thread()
397 lcs_do_run_thread(struct lcs_card *card, unsigned long thread) in lcs_do_run_thread() argument
400 wait_event(card->wait_q, in lcs_do_run_thread()
401 (rc = __lcs_do_run_thread(card, thread)) >= 0); in lcs_do_run_thread()
406 lcs_do_start_thread(struct lcs_card *card, unsigned long thread) in lcs_do_start_thread() argument
411 spin_lock_irqsave(&card->mask_lock, flags); in lcs_do_start_thread()
413 (u8) card->thread_start_mask, in lcs_do_start_thread()
414 (u8) card->thread_allowed_mask, in lcs_do_start_thread()
415 (u8) card->thread_running_mask); in lcs_do_start_thread()
416 rc = (card->thread_start_mask & thread); in lcs_do_start_thread()
417 spin_unlock_irqrestore(&card->mask_lock, flags); in lcs_do_start_thread()
425 lcs_setup_card(struct lcs_card *card) in lcs_setup_card() argument
428 LCS_DBF_HEX(2, setup, &card, sizeof(void*)); in lcs_setup_card()
430 lcs_setup_read(card); in lcs_setup_card()
431 lcs_setup_write(card); in lcs_setup_card()
433 card->state = DEV_STATE_DOWN; in lcs_setup_card()
434 card->tx_buffer = NULL; in lcs_setup_card()
435 card->tx_emitted = 0; in lcs_setup_card()
437 init_waitqueue_head(&card->wait_q); in lcs_setup_card()
438 spin_lock_init(&card->lock); in lcs_setup_card()
439 spin_lock_init(&card->ipm_lock); in lcs_setup_card()
440 spin_lock_init(&card->mask_lock); in lcs_setup_card()
442 INIT_LIST_HEAD(&card->ipm_list); in lcs_setup_card()
444 INIT_LIST_HEAD(&card->lancmd_waiters); in lcs_setup_card()
448 lcs_clear_multicast_list(struct lcs_card *card) in lcs_clear_multicast_list() argument
456 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_clear_multicast_list()
457 while (!list_empty(&card->ipm_list)){ in lcs_clear_multicast_list()
458 ipm = list_entry(card->ipm_list.next, in lcs_clear_multicast_list()
462 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_clear_multicast_list()
463 lcs_send_delipm(card, ipm); in lcs_clear_multicast_list()
464 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_clear_multicast_list()
468 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_clear_multicast_list()
475 lcs_cleanup_card(struct lcs_card *card) in lcs_cleanup_card() argument
479 LCS_DBF_HEX(2,setup,&card,sizeof(void*)); in lcs_cleanup_card()
481 if (card->dev != NULL) in lcs_cleanup_card()
482 free_netdev(card->dev); in lcs_cleanup_card()
484 lcs_cleanup_channel(&card->write); in lcs_cleanup_card()
485 lcs_cleanup_channel(&card->read); in lcs_cleanup_card()
569 lcs_start_channels(struct lcs_card *card) in lcs_start_channels() argument
575 rc = lcs_start_channel(&card->read); in lcs_start_channels()
579 rc = lcs_start_channel(&card->write); in lcs_start_channels()
581 lcs_stop_channel(&card->read); in lcs_start_channels()
589 lcs_stop_channels(struct lcs_card *card) in lcs_stop_channels() argument
592 lcs_stop_channel(&card->read); in lcs_stop_channels()
593 lcs_stop_channel(&card->write); in lcs_stop_channels()
753 lcs_get_lancmd(struct lcs_card *card, int count) in lcs_get_lancmd() argument
760 wait_event(card->write.wait_q, in lcs_get_lancmd()
761 ((buffer = lcs_get_buffer(&card->write)) != NULL)); in lcs_get_lancmd()
814 lcs_notify_lancmd_waiters(struct lcs_card *card, struct lcs_cmd *cmd) in lcs_notify_lancmd_waiters() argument
820 spin_lock(&card->lock); in lcs_notify_lancmd_waiters()
821 list_for_each_safe(l, n, &card->lancmd_waiters) { in lcs_notify_lancmd_waiters()
827 reply->callback(card, cmd); in lcs_notify_lancmd_waiters()
835 spin_unlock(&card->lock); in lcs_notify_lancmd_waiters()
849 spin_lock_irqsave(&reply->card->lock, flags); in lcs_lancmd_timeout()
851 &reply->card->lancmd_waiters,list) { in lcs_lancmd_timeout()
855 spin_unlock_irqrestore(&reply->card->lock, flags); in lcs_lancmd_timeout()
863 spin_unlock_irqrestore(&reply->card->lock, flags); in lcs_lancmd_timeout()
867 lcs_send_lancmd(struct lcs_card *card, struct lcs_buffer *buffer, in lcs_send_lancmd() argument
879 cmd->sequence_no = card->sequence_no++; in lcs_send_lancmd()
884 reply->card = card; in lcs_send_lancmd()
885 spin_lock_irqsave(&card->lock, flags); in lcs_send_lancmd()
886 list_add_tail(&reply->list, &card->lancmd_waiters); in lcs_send_lancmd()
887 spin_unlock_irqrestore(&card->lock, flags); in lcs_send_lancmd()
890 rc = lcs_ready_buffer(&card->write, buffer); in lcs_send_lancmd()
896 timer.expires = jiffies + HZ*card->lancmd_timeout; in lcs_send_lancmd()
911 lcs_send_startup(struct lcs_card *card, __u8 initiator) in lcs_send_startup() argument
917 buffer = lcs_get_lancmd(card, LCS_STD_CMD_SIZE); in lcs_send_startup()
922 return lcs_send_lancmd(card, buffer, NULL); in lcs_send_startup()
929 lcs_send_shutdown(struct lcs_card *card) in lcs_send_shutdown() argument
935 buffer = lcs_get_lancmd(card, LCS_STD_CMD_SIZE); in lcs_send_shutdown()
939 return lcs_send_lancmd(card, buffer, NULL); in lcs_send_shutdown()
946 __lcs_lanstat_cb(struct lcs_card *card, struct lcs_cmd *cmd) in __lcs_lanstat_cb() argument
949 memcpy(card->mac, cmd->cmd.lcs_lanstat_cmd.mac_addr, LCS_MAC_LENGTH); in __lcs_lanstat_cb()
953 lcs_send_lanstat(struct lcs_card *card) in lcs_send_lanstat() argument
959 buffer = lcs_get_lancmd(card, LCS_STD_CMD_SIZE); in lcs_send_lanstat()
964 cmd->cmd.lcs_std_cmd.lan_type = card->lan_type; in lcs_send_lanstat()
965 cmd->cmd.lcs_std_cmd.portno = card->portno; in lcs_send_lanstat()
966 return lcs_send_lancmd(card, buffer, __lcs_lanstat_cb); in lcs_send_lanstat()
973 lcs_send_stoplan(struct lcs_card *card, __u8 initiator) in lcs_send_stoplan() argument
979 buffer = lcs_get_lancmd(card, LCS_STD_CMD_SIZE); in lcs_send_stoplan()
983 cmd->cmd.lcs_std_cmd.lan_type = card->lan_type; in lcs_send_stoplan()
984 cmd->cmd.lcs_std_cmd.portno = card->portno; in lcs_send_stoplan()
985 return lcs_send_lancmd(card, buffer, NULL); in lcs_send_stoplan()
992 __lcs_send_startlan_cb(struct lcs_card *card, struct lcs_cmd *cmd) in __lcs_send_startlan_cb() argument
995 card->lan_type = cmd->cmd.lcs_std_cmd.lan_type; in __lcs_send_startlan_cb()
996 card->portno = cmd->cmd.lcs_std_cmd.portno; in __lcs_send_startlan_cb()
1000 lcs_send_startlan(struct lcs_card *card, __u8 initiator) in lcs_send_startlan() argument
1006 buffer = lcs_get_lancmd(card, LCS_STD_CMD_SIZE); in lcs_send_startlan()
1010 cmd->cmd.lcs_std_cmd.lan_type = card->lan_type; in lcs_send_startlan()
1011 cmd->cmd.lcs_std_cmd.portno = card->portno; in lcs_send_startlan()
1012 return lcs_send_lancmd(card, buffer, __lcs_send_startlan_cb); in lcs_send_startlan()
1020 lcs_send_setipm(struct lcs_card *card,struct lcs_ipm_list *ipm_list) in lcs_send_setipm() argument
1026 buffer = lcs_get_lancmd(card, LCS_MULTICAST_CMD_SIZE); in lcs_send_setipm()
1030 cmd->cmd.lcs_qipassist.lan_type = card->lan_type; in lcs_send_setipm()
1031 cmd->cmd.lcs_qipassist.portno = card->portno; in lcs_send_setipm()
1037 return lcs_send_lancmd(card, buffer, NULL); in lcs_send_setipm()
1044 lcs_send_delipm(struct lcs_card *card,struct lcs_ipm_list *ipm_list) in lcs_send_delipm() argument
1050 buffer = lcs_get_lancmd(card, LCS_MULTICAST_CMD_SIZE); in lcs_send_delipm()
1054 cmd->cmd.lcs_qipassist.lan_type = card->lan_type; in lcs_send_delipm()
1055 cmd->cmd.lcs_qipassist.portno = card->portno; in lcs_send_delipm()
1061 return lcs_send_lancmd(card, buffer, NULL); in lcs_send_delipm()
1068 __lcs_check_multicast_cb(struct lcs_card *card, struct lcs_cmd *cmd) in __lcs_check_multicast_cb() argument
1071 card->ip_assists_supported = in __lcs_check_multicast_cb()
1073 card->ip_assists_enabled = in __lcs_check_multicast_cb()
1078 lcs_check_multicast_support(struct lcs_card *card) in lcs_check_multicast_support() argument
1086 buffer = lcs_get_lancmd(card, LCS_STD_CMD_SIZE); in lcs_check_multicast_support()
1090 cmd->cmd.lcs_qipassist.lan_type = card->lan_type; in lcs_check_multicast_support()
1091 cmd->cmd.lcs_qipassist.portno = card->portno; in lcs_check_multicast_support()
1094 rc = lcs_send_lancmd(card, buffer, __lcs_check_multicast_cb); in lcs_check_multicast_support()
1099 if (card->ip_assists_supported & LCS_IPASS_MULTICAST_SUPPORT) in lcs_check_multicast_support()
1108 lcs_fix_multicast_list(struct lcs_card *card) in lcs_fix_multicast_list() argument
1117 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_fix_multicast_list()
1119 list_for_each_entry_safe(ipm, tmp, &card->ipm_list, list){ in lcs_fix_multicast_list()
1125 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_fix_multicast_list()
1126 rc = lcs_send_setipm(card, ipm); in lcs_fix_multicast_list()
1127 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_fix_multicast_list()
1138 list_add_tail(&ipm->list, &card->ipm_list); in lcs_fix_multicast_list()
1143 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_fix_multicast_list()
1144 lcs_send_delipm(card, ipm); in lcs_fix_multicast_list()
1145 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_fix_multicast_list()
1154 list_move_tail(&ipm->list, &card->ipm_list); in lcs_fix_multicast_list()
1156 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_fix_multicast_list()
1173 lcs_remove_mc_addresses(struct lcs_card *card, struct in_device *in4_dev) in lcs_remove_mc_addresses() argument
1182 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_remove_mc_addresses()
1183 list_for_each(l, &card->ipm_list) { in lcs_remove_mc_addresses()
1187 lcs_get_mac_for_ipm(im4->multiaddr, buf, card->dev); in lcs_remove_mc_addresses()
1196 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_remove_mc_addresses()
1200 lcs_check_addr_entry(struct lcs_card *card, struct ip_mc_list *im4, char *buf) in lcs_check_addr_entry() argument
1207 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_check_addr_entry()
1208 list_for_each(l, &card->ipm_list) { in lcs_check_addr_entry()
1217 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_check_addr_entry()
1222 lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev) in lcs_set_mc_addresses() argument
1233 lcs_get_mac_for_ipm(im4->multiaddr, buf, card->dev); in lcs_set_mc_addresses()
1234 ipm = lcs_check_addr_entry(card, im4, buf); in lcs_set_mc_addresses()
1246 spin_lock_irqsave(&card->ipm_lock, flags); in lcs_set_mc_addresses()
1248 list_add(&ipm->list, &card->ipm_list); in lcs_set_mc_addresses()
1249 spin_unlock_irqrestore(&card->ipm_lock, flags); in lcs_set_mc_addresses()
1256 struct lcs_card *card; in lcs_register_mc_addresses() local
1259 card = (struct lcs_card *) data; in lcs_register_mc_addresses()
1261 if (!lcs_do_run_thread(card, LCS_SET_MC_THREAD)) in lcs_register_mc_addresses()
1265 in4_dev = in_dev_get(card->dev); in lcs_register_mc_addresses()
1269 lcs_remove_mc_addresses(card,in4_dev); in lcs_register_mc_addresses()
1270 lcs_set_mc_addresses(card, in4_dev); in lcs_register_mc_addresses()
1274 netif_carrier_off(card->dev); in lcs_register_mc_addresses()
1275 netif_tx_disable(card->dev); in lcs_register_mc_addresses()
1276 wait_event(card->write.wait_q, in lcs_register_mc_addresses()
1277 (card->write.state != LCS_CH_STATE_RUNNING)); in lcs_register_mc_addresses()
1278 lcs_fix_multicast_list(card); in lcs_register_mc_addresses()
1279 if (card->state == DEV_STATE_UP) { in lcs_register_mc_addresses()
1280 netif_carrier_on(card->dev); in lcs_register_mc_addresses()
1281 netif_wake_queue(card->dev); in lcs_register_mc_addresses()
1284 lcs_clear_thread_running_bit(card, LCS_SET_MC_THREAD); in lcs_register_mc_addresses()
1297 struct lcs_card *card; in lcs_set_multicast_list() local
1300 card = (struct lcs_card *) dev->ml_priv; in lcs_set_multicast_list()
1302 if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) in lcs_set_multicast_list()
1303 schedule_work(&card->kernel_thread_starter); in lcs_set_multicast_list()
1377 lcs_schedule_recovery(struct lcs_card *card) in lcs_schedule_recovery() argument
1380 if (!lcs_set_thread_start_bit(card, LCS_RECOVERY_THREAD)) in lcs_schedule_recovery()
1381 schedule_work(&card->kernel_thread_starter); in lcs_schedule_recovery()
1390 struct lcs_card *card; in lcs_irq() local
1398 card = CARD_FROM_DEV(cdev); in lcs_irq()
1399 if (card->read.ccwdev == cdev) in lcs_irq()
1400 channel = &card->read; in lcs_irq()
1402 channel = &card->write; in lcs_irq()
1424 lcs_schedule_recovery(card); in lcs_irq()
1425 wake_up(&card->wait_q); in lcs_irq()
1509 __lcs_emit_txbuffer(struct lcs_card *card) in __lcs_emit_txbuffer() argument
1512 *(__u16 *)(card->tx_buffer->data + card->tx_buffer->count) = 0; in __lcs_emit_txbuffer()
1513 card->tx_buffer->count += 2; in __lcs_emit_txbuffer()
1514 lcs_ready_buffer(&card->write, card->tx_buffer); in __lcs_emit_txbuffer()
1515 card->tx_buffer = NULL; in __lcs_emit_txbuffer()
1516 card->tx_emitted++; in __lcs_emit_txbuffer()
1525 struct lcs_card *card; in lcs_txbuffer_cb() local
1530 card = container_of(channel, struct lcs_card, write); in lcs_txbuffer_cb()
1531 if (netif_queue_stopped(card->dev) && netif_carrier_ok(card->dev)) in lcs_txbuffer_cb()
1532 netif_wake_queue(card->dev); in lcs_txbuffer_cb()
1533 spin_lock(&card->lock); in lcs_txbuffer_cb()
1534 card->tx_emitted--; in lcs_txbuffer_cb()
1535 if (card->tx_emitted <= 0 && card->tx_buffer != NULL) in lcs_txbuffer_cb()
1540 __lcs_emit_txbuffer(card); in lcs_txbuffer_cb()
1541 spin_unlock(&card->lock); in lcs_txbuffer_cb()
1548 __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb, in __lcs_start_xmit() argument
1556 card->stats.tx_dropped++; in __lcs_start_xmit()
1557 card->stats.tx_errors++; in __lcs_start_xmit()
1560 if (card->state != DEV_STATE_UP) { in __lcs_start_xmit()
1562 card->stats.tx_dropped++; in __lcs_start_xmit()
1563 card->stats.tx_errors++; in __lcs_start_xmit()
1564 card->stats.tx_carrier_errors++; in __lcs_start_xmit()
1571 netif_stop_queue(card->dev); in __lcs_start_xmit()
1572 spin_lock(&card->lock); in __lcs_start_xmit()
1573 if (card->tx_buffer != NULL && in __lcs_start_xmit()
1574 card->tx_buffer->count + sizeof(struct lcs_header) + in __lcs_start_xmit()
1577 __lcs_emit_txbuffer(card); in __lcs_start_xmit()
1578 if (card->tx_buffer == NULL) { in __lcs_start_xmit()
1580 card->tx_buffer = lcs_get_buffer(&card->write); in __lcs_start_xmit()
1581 if (card->tx_buffer == NULL) { in __lcs_start_xmit()
1582 card->stats.tx_dropped++; in __lcs_start_xmit()
1586 card->tx_buffer->callback = lcs_txbuffer_cb; in __lcs_start_xmit()
1587 card->tx_buffer->count = 0; in __lcs_start_xmit()
1590 (card->tx_buffer->data + card->tx_buffer->count); in __lcs_start_xmit()
1591 card->tx_buffer->count += skb->len + sizeof(struct lcs_header); in __lcs_start_xmit()
1592 header->offset = card->tx_buffer->count; in __lcs_start_xmit()
1593 header->type = card->lan_type; in __lcs_start_xmit()
1594 header->slot = card->portno; in __lcs_start_xmit()
1596 spin_unlock(&card->lock); in __lcs_start_xmit()
1597 card->stats.tx_bytes += skb->len; in __lcs_start_xmit()
1598 card->stats.tx_packets++; in __lcs_start_xmit()
1600 netif_wake_queue(card->dev); in __lcs_start_xmit()
1601 spin_lock(&card->lock); in __lcs_start_xmit()
1602 if (card->tx_emitted <= 0 && card->tx_buffer != NULL) in __lcs_start_xmit()
1604 __lcs_emit_txbuffer(card); in __lcs_start_xmit()
1606 spin_unlock(&card->lock); in __lcs_start_xmit()
1613 struct lcs_card *card; in lcs_start_xmit() local
1617 card = (struct lcs_card *) dev->ml_priv; in lcs_start_xmit()
1618 rc = __lcs_start_xmit(card, skb, dev); in lcs_start_xmit()
1626 lcs_startlan_auto(struct lcs_card *card) in lcs_startlan_auto() argument
1632 card->lan_type = LCS_FRAME_TYPE_ENET; in lcs_startlan_auto()
1633 rc = lcs_send_startlan(card, LCS_INITIATOR_TCPIP); in lcs_startlan_auto()
1639 card->lan_type = LCS_FRAME_TYPE_FDDI; in lcs_startlan_auto()
1640 rc = lcs_send_startlan(card, LCS_INITIATOR_TCPIP); in lcs_startlan_auto()
1648 lcs_startlan(struct lcs_card *card) in lcs_startlan() argument
1654 if (card->portno != LCS_INVALID_PORT_NO) { in lcs_startlan()
1655 if (card->lan_type == LCS_FRAME_TYPE_AUTO) in lcs_startlan()
1656 rc = lcs_startlan_auto(card); in lcs_startlan()
1658 rc = lcs_send_startlan(card, LCS_INITIATOR_TCPIP); in lcs_startlan()
1661 card->portno = i; in lcs_startlan()
1662 if (card->lan_type != LCS_FRAME_TYPE_AUTO) in lcs_startlan()
1663 rc = lcs_send_startlan(card, in lcs_startlan()
1667 rc = lcs_startlan_auto(card); in lcs_startlan()
1673 return lcs_send_lanstat(card); in lcs_startlan()
1682 lcs_detect(struct lcs_card *card) in lcs_detect() argument
1688 if (card->dev) in lcs_detect()
1689 netif_stop_queue(card->dev); in lcs_detect()
1690 rc = lcs_stop_channels(card); in lcs_detect()
1692 rc = lcs_start_channels(card); in lcs_detect()
1694 rc = lcs_send_startup(card, LCS_INITIATOR_TCPIP); in lcs_detect()
1696 rc = lcs_startlan(card); in lcs_detect()
1700 card->state = DEV_STATE_UP; in lcs_detect()
1702 card->state = DEV_STATE_DOWN; in lcs_detect()
1703 card->write.state = LCS_CH_STATE_INIT; in lcs_detect()
1704 card->read.state = LCS_CH_STATE_INIT; in lcs_detect()
1713 lcs_stopcard(struct lcs_card *card) in lcs_stopcard() argument
1719 if (card->read.state != LCS_CH_STATE_STOPPED && in lcs_stopcard()
1720 card->write.state != LCS_CH_STATE_STOPPED && in lcs_stopcard()
1721 card->read.state != LCS_CH_STATE_ERROR && in lcs_stopcard()
1722 card->write.state != LCS_CH_STATE_ERROR && in lcs_stopcard()
1723 card->state == DEV_STATE_UP) { in lcs_stopcard()
1724 lcs_clear_multicast_list(card); in lcs_stopcard()
1725 rc = lcs_send_stoplan(card,LCS_INITIATOR_TCPIP); in lcs_stopcard()
1726 rc = lcs_send_shutdown(card); in lcs_stopcard()
1728 rc = lcs_stop_channels(card); in lcs_stopcard()
1729 card->state = DEV_STATE_DOWN; in lcs_stopcard()
1740 struct lcs_card *card = container_of(work, struct lcs_card, kernel_thread_starter); in lcs_start_kernel_thread() local
1742 if (lcs_do_start_thread(card, LCS_RECOVERY_THREAD)) in lcs_start_kernel_thread()
1743 kthread_run(lcs_recovery, card, "lcs_recover"); in lcs_start_kernel_thread()
1745 if (lcs_do_start_thread(card, LCS_SET_MC_THREAD)) in lcs_start_kernel_thread()
1746 kthread_run(lcs_register_mc_addresses, card, "regipm"); in lcs_start_kernel_thread()
1754 lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd) in lcs_get_control() argument
1761 lcs_schedule_recovery(card); in lcs_get_control()
1765 card->dev->name); in lcs_get_control()
1766 if (card->dev) in lcs_get_control()
1767 netif_carrier_off(card->dev); in lcs_get_control()
1774 lcs_notify_lancmd_waiters(card, cmd); in lcs_get_control()
1781 lcs_get_skb(struct lcs_card *card, char *skb_data, unsigned int skb_len) in lcs_get_skb() argument
1786 if (card->dev == NULL || in lcs_get_skb()
1787 card->state != DEV_STATE_UP) in lcs_get_skb()
1793 dev_err(&card->dev->dev, in lcs_get_skb()
1795 card->dev->name); in lcs_get_skb()
1796 card->stats.rx_dropped++; in lcs_get_skb()
1800 skb->protocol = card->lan_type_trans(skb, card->dev); in lcs_get_skb()
1801 card->stats.rx_bytes += skb_len; in lcs_get_skb()
1802 card->stats.rx_packets++; in lcs_get_skb()
1804 *((__u32 *)skb->cb) = ++card->pkt_seq; in lcs_get_skb()
1814 struct lcs_card *card; in lcs_get_frames_cb() local
1824 card = container_of(channel, struct lcs_card, read); in lcs_get_frames_cb()
1831 card->stats.rx_length_errors++; in lcs_get_frames_cb()
1832 card->stats.rx_errors++; in lcs_get_frames_cb()
1838 lcs_get_control(card, (struct lcs_cmd *) lcs_hdr); in lcs_get_frames_cb()
1843 lcs_get_skb(card, (char *)(lcs_hdr + 1), in lcs_get_frames_cb()
1855 lcs_ready_buffer(&card->read, buffer); in lcs_get_frames_cb()
1864 struct lcs_card *card; in lcs_getstats() local
1867 card = (struct lcs_card *) dev->ml_priv; in lcs_getstats()
1868 return &card->stats; in lcs_getstats()
1878 struct lcs_card *card; in lcs_stop_device() local
1882 card = (struct lcs_card *) dev->ml_priv; in lcs_stop_device()
1886 wait_event(card->write.wait_q, in lcs_stop_device()
1887 (card->write.state != LCS_CH_STATE_RUNNING)); in lcs_stop_device()
1888 rc = lcs_stopcard(card); in lcs_stop_device()
1890 dev_err(&card->dev->dev, in lcs_stop_device()
1902 struct lcs_card *card; in lcs_open_device() local
1906 card = (struct lcs_card *) dev->ml_priv; in lcs_open_device()
1908 rc = lcs_detect(card); in lcs_open_device()
1916 card->state = DEV_STATE_UP; in lcs_open_device()
1927 struct lcs_card *card; in lcs_portno_show() local
1929 card = dev_get_drvdata(dev); in lcs_portno_show()
1931 if (!card) in lcs_portno_show()
1934 return sprintf(buf, "%d\n", card->portno); in lcs_portno_show()
1943 struct lcs_card *card; in lcs_portno_store() local
1947 card = dev_get_drvdata(dev); in lcs_portno_store()
1949 if (!card) in lcs_portno_store()
1956 card->portno = value; in lcs_portno_store()
1990 struct lcs_card *card; in lcs_timeout_show() local
1992 card = dev_get_drvdata(dev); in lcs_timeout_show()
1994 return card ? sprintf(buf, "%u\n", card->lancmd_timeout) : 0; in lcs_timeout_show()
2000 struct lcs_card *card; in lcs_timeout_store() local
2004 card = dev_get_drvdata(dev); in lcs_timeout_store()
2006 if (!card) in lcs_timeout_store()
2013 card->lancmd_timeout = value; in lcs_timeout_store()
2025 struct lcs_card *card = dev_get_drvdata(dev); in lcs_dev_recover_store() local
2029 if (!card) in lcs_dev_recover_store()
2031 if (card->state != DEV_STATE_UP) in lcs_dev_recover_store()
2035 lcs_schedule_recovery(card); in lcs_dev_recover_store()
2066 struct lcs_card *card; in lcs_probe_device() local
2072 card = lcs_alloc_card(); in lcs_probe_device()
2073 if (!card) { in lcs_probe_device()
2078 dev_set_drvdata(&ccwgdev->dev, card); in lcs_probe_device()
2081 card->gdev = ccwgdev; in lcs_probe_device()
2082 INIT_WORK(&card->kernel_thread_starter, lcs_start_kernel_thread); in lcs_probe_device()
2083 card->thread_start_mask = 0; in lcs_probe_device()
2084 card->thread_allowed_mask = 0; in lcs_probe_device()
2085 card->thread_running_mask = 0; in lcs_probe_device()
2094 struct lcs_card *card; in lcs_register_netdev() local
2097 card = dev_get_drvdata(&ccwgdev->dev); in lcs_register_netdev()
2098 if (card->dev->reg_state != NETREG_UNINITIALIZED) in lcs_register_netdev()
2100 SET_NETDEV_DEV(card->dev, &ccwgdev->dev); in lcs_register_netdev()
2101 return register_netdev(card->dev); in lcs_register_netdev()
2125 struct lcs_card *card; in lcs_new_device() local
2130 card = dev_get_drvdata(&ccwgdev->dev); in lcs_new_device()
2131 if (!card) in lcs_new_device()
2135 LCS_DBF_HEX(3, setup, &card, sizeof(void*)); in lcs_new_device()
2136 card->read.ccwdev = ccwgdev->cdev[0]; in lcs_new_device()
2137 card->write.ccwdev = ccwgdev->cdev[1]; in lcs_new_device()
2139 recover_state = card->state; in lcs_new_device()
2140 rc = ccw_device_set_online(card->read.ccwdev); in lcs_new_device()
2143 rc = ccw_device_set_online(card->write.ccwdev); in lcs_new_device()
2149 lcs_setup_card(card); in lcs_new_device()
2150 rc = lcs_detect(card); in lcs_new_device()
2153 dev_err(&card->dev->dev, in lcs_new_device()
2156 lcs_stopcard(card); in lcs_new_device()
2159 if (card->dev) { in lcs_new_device()
2161 LCS_DBF_HEX(3, setup, &card, sizeof(void*)); in lcs_new_device()
2164 switch (card->lan_type) { in lcs_new_device()
2167 card->lan_type_trans = eth_type_trans; in lcs_new_device()
2173 card->lan_type_trans = fddi_type_trans; in lcs_new_device()
2184 card->dev = dev; in lcs_new_device()
2185 card->dev->ml_priv = card; in lcs_new_device()
2186 card->dev->netdev_ops = &lcs_netdev_ops; in lcs_new_device()
2187 memcpy(card->dev->dev_addr, card->mac, LCS_MAC_LENGTH); in lcs_new_device()
2189 if (!lcs_check_multicast_support(card)) in lcs_new_device()
2190 card->dev->netdev_ops = &lcs_mc_netdev_ops; in lcs_new_device()
2193 lcs_set_allowed_threads(card,0xffffffff); in lcs_new_device()
2195 lcs_set_multicast_list(card->dev); in lcs_new_device()
2196 card->dev->flags |= IFF_UP; in lcs_new_device()
2197 netif_carrier_on(card->dev); in lcs_new_device()
2198 netif_wake_queue(card->dev); in lcs_new_device()
2199 card->state = DEV_STATE_UP; in lcs_new_device()
2201 lcs_stopcard(card); in lcs_new_device()
2208 pr_info("LCS device %s %s IPv6 support\n", card->dev->name, in lcs_new_device()
2209 (card->ip_assists_supported & LCS_IPASS_IPV6_SUPPORT) ? in lcs_new_device()
2212 pr_info("LCS device %s %s Multicast support\n", card->dev->name, in lcs_new_device()
2213 (card->ip_assists_supported & LCS_IPASS_MULTICAST_SUPPORT) ? in lcs_new_device()
2218 ccw_device_set_offline(card->write.ccwdev); in lcs_new_device()
2220 ccw_device_set_offline(card->read.ccwdev); in lcs_new_device()
2231 struct lcs_card *card; in __lcs_shutdown_device() local
2236 card = dev_get_drvdata(&ccwgdev->dev); in __lcs_shutdown_device()
2237 if (!card) in __lcs_shutdown_device()
2240 lcs_set_allowed_threads(card, 0); in __lcs_shutdown_device()
2241 if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD)) in __lcs_shutdown_device()
2244 LCS_DBF_HEX(3, setup, &card, sizeof(void*)); in __lcs_shutdown_device()
2245 recover_state = card->state; in __lcs_shutdown_device()
2247 ret = lcs_stop_device(card->dev); in __lcs_shutdown_device()
2248 ret2 = ccw_device_set_offline(card->read.ccwdev); in __lcs_shutdown_device()
2249 ret3 = ccw_device_set_offline(card->write.ccwdev); in __lcs_shutdown_device()
2255 card->state = DEV_STATE_RECOVER; in __lcs_shutdown_device()
2272 struct lcs_card *card; in lcs_recovery() local
2276 card = (struct lcs_card *) ptr; in lcs_recovery()
2279 if (!lcs_do_run_thread(card, LCS_RECOVERY_THREAD)) in lcs_recovery()
2282 gdev = card->gdev; in lcs_recovery()
2289 card->dev->name); in lcs_recovery()
2292 card->dev->name); in lcs_recovery()
2293 lcs_clear_thread_running_bit(card, LCS_RECOVERY_THREAD); in lcs_recovery()
2303 struct lcs_card *card; in lcs_remove_device() local
2305 card = dev_get_drvdata(&ccwgdev->dev); in lcs_remove_device()
2306 if (!card) in lcs_remove_device()
2310 LCS_DBF_HEX(3, setup, &card, sizeof(void*)); in lcs_remove_device()
2314 if (card->dev) in lcs_remove_device()
2315 unregister_netdev(card->dev); in lcs_remove_device()
2316 lcs_cleanup_card(card); in lcs_remove_device()
2317 lcs_free_card(card); in lcs_remove_device()
2322 static int lcs_pm_suspend(struct lcs_card *card) in lcs_pm_suspend() argument
2324 if (card->dev) in lcs_pm_suspend()
2325 netif_device_detach(card->dev); in lcs_pm_suspend()
2326 lcs_set_allowed_threads(card, 0); in lcs_pm_suspend()
2327 lcs_wait_for_threads(card, 0xffffffff); in lcs_pm_suspend()
2328 if (card->state != DEV_STATE_DOWN) in lcs_pm_suspend()
2329 __lcs_shutdown_device(card->gdev, 1); in lcs_pm_suspend()
2333 static int lcs_pm_resume(struct lcs_card *card) in lcs_pm_resume() argument
2337 if (card->state == DEV_STATE_RECOVER) in lcs_pm_resume()
2338 rc = lcs_new_device(card->gdev); in lcs_pm_resume()
2339 if (card->dev) in lcs_pm_resume()
2340 netif_device_attach(card->dev); in lcs_pm_resume()
2342 dev_warn(&card->gdev->dev, "The lcs device driver " in lcs_pm_resume()
2360 struct lcs_card *card = dev_get_drvdata(&gdev->dev); in lcs_freeze() local
2361 return lcs_pm_suspend(card); in lcs_freeze()
2366 struct lcs_card *card = dev_get_drvdata(&gdev->dev); in lcs_thaw() local
2367 return lcs_pm_resume(card); in lcs_thaw()
2372 struct lcs_card *card = dev_get_drvdata(&gdev->dev); in lcs_restore() local
2373 return lcs_pm_resume(card); in lcs_restore()