static int mscan_restart(struct net_device *dev) { struct mscan_priv *priv = netdev_priv(dev); if (priv->type == MSCAN_TYPE_MPC5121) { struct mscan_regs __iomem *regs = priv->reg_base; priv->can.state = CAN_STATE_ERROR_ACTIVE; WARN(!(in_8(®s->canmisc) & MSCAN_BOHOLD), "bus-off state expected\n"); out_8(®s->canmisc, MSCAN_BOHOLD); /* Re-enable receive interrupts. */ out_8(®s->canrier, MSCAN_RX_INTS_ENABLE); } else { if (priv->can.state <= CAN_STATE_BUS_OFF) mscan_set_mode(dev, MSCAN_INIT_MODE); return mscan_start(dev); } return 0; }
/*TASK*----------------------------------------------------------- * * Task Name : Main_Task * Comments : * This file tests functions in the MSCAN library. * *END*-----------------------------------------------------------*/ void Main_Task(uint_32 parameter) { uint_32 result; char data_ptr[80]; uint_32 mscan_mode = MSCAN_LOOPBACK_MODE; uint_32 format = CAN_STANDARD; uint_32 bit_rate = 250; uint_32 interrupt = CAN_DISABLE; uint_32 mscan_error_interrupt = 0; uint_32 mscan_time_stamp = MSCAN_WITH_TIMESTAMP; uint_32 identifier = 0x392; uint_32 data_len_code = 8; uint_32 filter_hit; uint_32 priority = 2; uint_32 mscan_filter_mode = MSCAN_FILTER_16_BIT_MODE; uint_32 filter1 = 0x4AE0; uint_32 filter2 = 0x7EC0; uint_32 mask1 = 0x0260; uint_32 mask2 = 0x1C80; recv_format = format; _int_install_unexpected_isr(); printf("\n*****************MSCAN test program*****************\n"); printf("\nCAN operates in %s mode", mscan_mode == MSCAN_LOOPBACK_MODE ? "loopback" : "non loopback"); printf("\nBit rate: %d kbps", bit_rate); printf("\n%s message format used", format == CAN_EXTENDED ? "Extended" : "Standard"); printf("\nMessage id: 0x%08x", identifier); printf("\nMessage priority: %d", priority); printf("\nMessage is%s time stamped", mscan_time_stamp == MSCAN_WITH_TIMESTAMP ? "" : " not"); printf("\nData length: %d bytes", data_len_code); printf("\nTx/Rx interrupt %s", interrupt == CAN_ENABLE ? "enabled" : "disabled"); printf("\nError interrupts %s", mscan_error_interrupt ? "enabled" : "disabled"); printf("\n%d bit filter mode selected", mscan_filter_mode); printf("\nMessage filter1: 0x%08x", filter1); printf("\nMessage filter2: 0x%08x", filter2); printf("\nID mask1: 0x%08x", mask1); printf("\nID mask2: 0x%08x\n", mask2); printf("\n****************************************************\n"); /* Initialize MSCAN device at given bit rate */ result = mscan_init((pointer)TEST_MODULE, bit_rate, NULL); printf("\n MSCAN1 initialization. result: 0x%lx", result); /* Initialize MSCAN mode */ result = mscan_select_mode((pointer)TEST_MODULE, mscan_mode, interrupt); printf("\n MSCAN1 initialization mode. result: 0x%lx", result); /* Select Filtering mode */ result = mscan_filter_init((pointer)TEST_MODULE, mscan_filter_mode, filter1, filter2, mask1, mask2, format); printf("\n MSCAN1 Filter selected. result: 0x%lx", result); /* Take MSCAN out of initialization mode */ result = mscan_start((pointer)TEST_MODULE); printf("\n MSCAN1 out of initialization mode. result: 0x%lx", result); /* Install ISR */ if(interrupt == CAN_ENABLE) { result = mscan_int_init( (pointer)TEST_MODULE, (pointer)mscan_test_isr ); printf("\n MSCAN1 ISR install. result: 0x%lx", result); } /* Enable Timer */ result = mscan_timestamp_select((pointer)TEST_MODULE, mscan_time_stamp); printf("\n MSCAN1 Time Stamp selected. result: 0x%lx", result); /* Enable Error interrupts */ if (mscan_error_interrupt) { result = mscan_error_int_enable((pointer)TEST_MODULE, CAN_RX); printf("\n MSCAN1 Error interrupt enable for Rx. result: 0x%lx", result); result = mscan_error_int_enable((pointer)TEST_MODULE, CAN_TX); printf("\n MSCAN1 Error interrupt enable for Tx. result: 0x%lx", result); } /* Start the loop */ while(1) { printf("\n\nEnter an string to transmit followed by ENTER:"); memset (data_ptr, 0, sizeof (data_ptr)); _io_gets(data_ptr); result = mscan_tx_message((pointer)TEST_MODULE, (void *)data_ptr, priority, identifier, data_len_code, format, interrupt); if(result != MSCAN_OK) printf("\nTransmit error. Error Code: 0x%lx", result); else printf("\nData transmit: %s", data_ptr); _time_delay (100); if(interrupt != CAN_ENABLE) { recv_result = mscan_rx_message((pointer)TEST_MODULE, (void *)recv_data, &recv_id, &recv_len, recv_format, &recv_hit, CAN_DISABLE); } if(recv_result != MSCAN_OK) printf("\nReceived error. Error Code: 0x%lx", recv_result); else { recv_data[recv_len] = 0; printf("\nReceived data: %s", recv_data); printf("\nID is: 0x%x", recv_id); printf("\nDLC is: 0x%x", recv_len); printf("\nFilter Hit: 0x%x\n\n", recv_hit); } } }