master/device.c
branchstable-1.5
changeset 2454 5cf6bb14a579
parent 2453 d461b1f07296
parent 2451 cc852c40e299
child 2522 ec403cf308eb
equal deleted inserted replaced
2453:d461b1f07296 2454:5cf6bb14a579
    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 
       
    80     device->master = master;
       
    81     device->tx_ring_index = 0;
       
    82 
   111 
    83 #ifdef EC_DEBUG_IF
   112 #ifdef EC_DEBUG_IF
    84     if (device == &master->devices[EC_DEVICE_MAIN]) {
   113     if (device == &master->devices[EC_DEVICE_MAIN]) {
    85         mb = 'm';
   114         mb = 'm';
    86     }
   115     }
    94     if (ret < 0) {
   123     if (ret < 0) {
    95         EC_MASTER_ERR(master, "Failed to init debug device!\n");
   124         EC_MASTER_ERR(master, "Failed to init debug device!\n");
    96         goto out_return;
   125         goto out_return;
    97     }
   126     }
    98 #endif
   127 #endif
    99 
       
   100     for (i = 0; i < EC_TX_RING_SIZE; i++)
       
   101         device->tx_skb[i] = NULL;
       
   102 
   128 
   103     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   129     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   104         if (!(device->tx_skb[i] = dev_alloc_skb(ETH_FRAME_LEN))) {
   130         if (!(device->tx_skb[i] = dev_alloc_skb(ETH_FRAME_LEN))) {
   105             EC_MASTER_ERR(master, "Error allocating device socket buffer!\n");
   131             EC_MASTER_ERR(master, "Error allocating device socket buffer!\n");
   106             ret = -ENOMEM;
   132             ret = -ENOMEM;
   112         eth = (struct ethhdr *) skb_push(device->tx_skb[i], ETH_HLEN);
   138         eth = (struct ethhdr *) skb_push(device->tx_skb[i], ETH_HLEN);
   113         eth->h_proto = htons(0x88A4);
   139         eth->h_proto = htons(0x88A4);
   114         memset(eth->h_dest, 0xFF, ETH_ALEN);
   140         memset(eth->h_dest, 0xFF, ETH_ALEN);
   115     }
   141     }
   116 
   142 
   117     ec_device_detach(device); // resets remaining fields
       
   118     return 0;
   143     return 0;
   119 
   144 
   120 out_tx_ring:
   145 out_tx_ring:
   121     for (i = 0; i < EC_TX_RING_SIZE; i++)
   146     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   122         if (device->tx_skb[i])
   147         if (device->tx_skb[i]) {
   123             dev_kfree_skb(device->tx_skb[i]);
   148             dev_kfree_skb(device->tx_skb[i]);
       
   149         }
       
   150     }
   124 #ifdef EC_DEBUG_IF
   151 #ifdef EC_DEBUG_IF
   125     ec_debug_clear(&device->dbg);
   152     ec_debug_clear(&device->dbg);
   126 out_return:
   153 out_return:
   127 #endif
   154 #endif
   128     return ret;
   155     return ret;
   199     device->open = 0;
   226     device->open = 0;
   200     device->link_state = 0; // down
   227     device->link_state = 0; // down
   201 
   228 
   202     ec_device_clear_stats(device);
   229     ec_device_clear_stats(device);
   203 
   230 
   204     for (i = 0; i < EC_TX_RING_SIZE; i++)
   231     for (i = 0; i < EC_TX_RING_SIZE; i++) {
   205         device->tx_skb[i]->dev = NULL;
   232         device->tx_skb[i]->dev = NULL;
       
   233     }
   206 }
   234 }
   207 
   235 
   208 /*****************************************************************************/
   236 /*****************************************************************************/
   209 
   237 
   210 /** Opens the EtherCAT device.
   238 /** Opens the EtherCAT device.
   381         )
   409         )
   382 {
   410 {
   383     ec_debug_frame_t *df = &device->debug_frames[device->debug_frame_index];
   411     ec_debug_frame_t *df = &device->debug_frames[device->debug_frame_index];
   384 
   412 
   385     df->dir = dir;
   413     df->dir = dir;
   386     if (dir == TX)
   414     if (dir == TX) {
   387         do_gettimeofday(&df->t);
   415         do_gettimeofday(&df->t);
   388     else
   416     }
       
   417     else {
   389         df->t = device->timeval_poll;
   418         df->t = device->timeval_poll;
       
   419     }
   390     memcpy(df->data, data, size);
   420     memcpy(df->data, data, size);
   391     df->data_size = size;
   421     df->data_size = size;
   392 
   422 
   393     device->debug_frame_index++;
   423     device->debug_frame_index++;
   394     device->debug_frame_index %= EC_DEBUG_RING_SIZE;
   424     device->debug_frame_index %= EC_DEBUG_RING_SIZE;