equal
deleted
inserted
replaced
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; |