master/device.c
branchstable-1.5
changeset 2451 cc852c40e299
parent 2421 bc2d4bf9cbe5
child 2454 5cf6bb14a579
equal deleted inserted replaced
2450:c0cf0e6cff43 2451:cc852c40e299
    70     struct ethhdr *eth;
    70     struct ethhdr *eth;
    71 #ifdef EC_DEBUG_IF
    71 #ifdef EC_DEBUG_IF
    72     char ifname[10];
    72     char ifname[10];
    73     char mb = 'x';
    73     char mb = 'x';
    74 #endif
    74 #endif
       
    75 
       
    76     device->master = master;
       
    77     device->dev = NULL;
       
    78     device->poll = NULL;
       
    79     device->module = NULL;
       
    80     device->open = 0;
       
    81     device->link_state = 0;
       
    82     for (i = 0; i < EC_TX_RING_SIZE; i++) {
       
    83         device->tx_skb[i] = NULL;
       
    84     }
       
    85     device->tx_ring_index = 0;
       
    86 #ifdef EC_HAVE_CYCLES
       
    87     device->cycles_poll = 0;
       
    88 #endif
       
    89 #ifdef EC_DEBUG_RING
       
    90     device->timeval_poll.tv_sec = 0;
       
    91     device->timeval_poll.tv_usec = 0;
       
    92 #endif
       
    93     device->jiffies_poll = 0;
       
    94 
       
    95     ec_device_clear_stats(device);
       
    96 
       
    97 #ifdef EC_DEBUG_RING
       
    98     for (i = 0; i < EC_DEBUG_RING_SIZE; i++) {
       
    99         ec_debug_frame_t *df = &device->debug_frames[i];
       
   100         df->dir = TX;
       
   101         df->t.tv_sec = 0;
       
   102         df->t.tv_usec = 0;
       
   103         memset(df->data, 0, EC_MAX_DATA_SIZE);
       
   104         df->data_size = 0;
       
   105     }
       
   106 #endif
    75 #ifdef EC_DEBUG_RING
   107 #ifdef EC_DEBUG_RING
    76     device->debug_frame_index = 0;
   108     device->debug_frame_index = 0;
    77     device->debug_frame_count = 0;
   109     device->debug_frame_count = 0;
    78 #endif
   110 #endif
    79 
   111 
    80     device->master = master;
       
    81     device->tx_ring_index = 0;
       
    82 
       
    83 #ifdef EC_DEBUG_IF
   112 #ifdef EC_DEBUG_IF
    84     if (device == &master->main_device)
   113     if (device == &master->devices[EC_DEVICE_MAIN]) {
    85         mb = 'm';
   114         mb = 'm';
    86     else if (device == &master->backup_device)
   115     }
       
   116     else if (device == &master->devices[EC_DEVICE_BACKUP]) {
    87         mb = 'b';
   117         mb = 'b';
       
   118     }
    88 
   119 
    89     sprintf(ifname, "ecdbg%c%u", mb, master->index);
   120     sprintf(ifname, "ecdbg%c%u", mb, master->index);
    90 
   121 
    91     ret = ec_debug_init(&device->dbg, device, ifname);
   122     ret = ec_debug_init(&device->dbg, device, ifname);
    92     if (ret < 0) {
   123     if (ret < 0) {
    93         EC_MASTER_ERR(master, "Failed to init debug device!\n");
   124         EC_MASTER_ERR(master, "Failed to init debug device!\n");
    94         goto out_return;
   125         goto out_return;
    95     }
   126     }
    96 #endif
   127 #endif
    97 
       
    98     for (i = 0; i < EC_TX_RING_SIZE; i++)
       
    99         device->tx_skb[i] = NULL;
       
   100 
   128 
   101     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   129     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   102         if (!(device->tx_skb[i] = dev_alloc_skb(ETH_FRAME_LEN))) {
   130         if (!(device->tx_skb[i] = dev_alloc_skb(ETH_FRAME_LEN))) {
   103             EC_MASTER_ERR(master, "Error allocating device socket buffer!\n");
   131             EC_MASTER_ERR(master, "Error allocating device socket buffer!\n");
   104             ret = -ENOMEM;
   132             ret = -ENOMEM;
   110         eth = (struct ethhdr *) skb_push(device->tx_skb[i], ETH_HLEN);
   138         eth = (struct ethhdr *) skb_push(device->tx_skb[i], ETH_HLEN);
   111         eth->h_proto = htons(0x88A4);
   139         eth->h_proto = htons(0x88A4);
   112         memset(eth->h_dest, 0xFF, ETH_ALEN);
   140         memset(eth->h_dest, 0xFF, ETH_ALEN);
   113     }
   141     }
   114 
   142 
   115     ec_device_detach(device); // resets remaining fields
       
   116     return 0;
   143     return 0;
   117 
   144 
   118 out_tx_ring:
   145 out_tx_ring:
   119     for (i = 0; i < EC_TX_RING_SIZE; i++)
   146     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   120         if (device->tx_skb[i])
   147         if (device->tx_skb[i]) {
   121             dev_kfree_skb(device->tx_skb[i]);
   148             dev_kfree_skb(device->tx_skb[i]);
       
   149         }
       
   150     }
   122 #ifdef EC_DEBUG_IF
   151 #ifdef EC_DEBUG_IF
   123     ec_debug_clear(&device->dbg);
   152     ec_debug_clear(&device->dbg);
   124 out_return:
   153 out_return:
   125 #endif
   154 #endif
   126     return ret;
   155     return ret;
   195     device->open = 0;
   224     device->open = 0;
   196     device->link_state = 0; // down
   225     device->link_state = 0; // down
   197 
   226 
   198     ec_device_clear_stats(device);
   227     ec_device_clear_stats(device);
   199 
   228 
   200     for (i = 0; i < EC_TX_RING_SIZE; i++)
   229     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   201         device->tx_skb[i]->dev = NULL;
   230         device->tx_skb[i]->dev = NULL;
       
   231     }
   202 }
   232 }
   203 
   233 
   204 /*****************************************************************************/
   234 /*****************************************************************************/
   205 
   235 
   206 /** Opens the EtherCAT device.
   236 /** Opens the EtherCAT device.
   377         )
   407         )
   378 {
   408 {
   379     ec_debug_frame_t *df = &device->debug_frames[device->debug_frame_index];
   409     ec_debug_frame_t *df = &device->debug_frames[device->debug_frame_index];
   380 
   410 
   381     df->dir = dir;
   411     df->dir = dir;
   382     if (dir == TX)
   412     if (dir == TX) {
   383         do_gettimeofday(&df->t);
   413         do_gettimeofday(&df->t);
   384     else
   414     }
       
   415     else {
   385         df->t = device->timeval_poll;
   416         df->t = device->timeval_poll;
       
   417     }
   386     memcpy(df->data, data, size);
   418     memcpy(df->data, data, size);
   387     df->data_size = size;
   419     df->data_size = size;
   388 
   420 
   389     device->debug_frame_index++;
   421     device->debug_frame_index++;
   390     device->debug_frame_index %= EC_DEBUG_RING_SIZE;
   422     device->debug_frame_index %= EC_DEBUG_RING_SIZE;