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; |