52 Device constructor. |
52 Device constructor. |
53 \return 0 in case of success, else < 0 |
53 \return 0 in case of success, else < 0 |
54 */ |
54 */ |
55 |
55 |
56 int ec_device_init(ec_device_t *device, /**< EtherCAT device */ |
56 int ec_device_init(ec_device_t *device, /**< EtherCAT device */ |
57 ec_master_t *master, /**< master owning the device */ |
57 ec_master_t *master /**< master owning the device */ |
58 struct net_device *net_dev, /**< net_device structure */ |
58 ) |
59 ec_pollfunc_t poll, /**< pointer to device's poll function */ |
59 { |
60 struct module *module /**< the device's module */ |
|
61 ) |
|
62 { |
|
63 struct ethhdr *eth; |
|
64 |
|
65 device->master = master; |
60 device->master = master; |
|
61 |
|
62 #ifdef EC_DBG_IF |
|
63 if (ec_debug_init(&device->dbg)) { |
|
64 EC_ERR("Failed to init debug device!\n"); |
|
65 goto out_return; |
|
66 } |
|
67 #endif |
|
68 |
|
69 if (!(device->tx_skb = dev_alloc_skb(ETH_FRAME_LEN))) { |
|
70 EC_ERR("Error allocating device socket buffer!\n"); |
|
71 #ifdef EC_DBG_IF |
|
72 goto out_debug; |
|
73 #else |
|
74 goto out_return; |
|
75 #endif |
|
76 } |
|
77 |
|
78 // add Ethernet-II-header |
|
79 skb_reserve(device->tx_skb, ETH_HLEN); |
|
80 device->eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN); |
|
81 device->eth->h_proto = htons(0x88A4); |
|
82 memset(device->eth->h_dest, 0xFF, ETH_ALEN); |
|
83 |
|
84 ec_device_detach(device); // resets remaining fields |
|
85 return 0; |
|
86 |
|
87 #ifdef EC_DBG_IF |
|
88 out_debug: |
|
89 ec_debug_clear(&device->dbg); |
|
90 #endif |
|
91 out_return: |
|
92 return -1; |
|
93 } |
|
94 |
|
95 /*****************************************************************************/ |
|
96 |
|
97 /** |
|
98 EtherCAT device destuctor. |
|
99 */ |
|
100 |
|
101 void ec_device_clear(ec_device_t *device /**< EtherCAT device */) |
|
102 { |
|
103 if (device->open) ec_device_close(device); |
|
104 dev_kfree_skb(device->tx_skb); |
|
105 #ifdef EC_DBG_IF |
|
106 ec_debug_clear(&device->dbg); |
|
107 #endif |
|
108 } |
|
109 |
|
110 /*****************************************************************************/ |
|
111 |
|
112 /** |
|
113 Associate with net_device. |
|
114 */ |
|
115 |
|
116 void ec_device_attach(ec_device_t *device, /**< EtherCAT device */ |
|
117 struct net_device *net_dev, /**< net_device structure */ |
|
118 ec_pollfunc_t poll, /**< pointer to device's poll function */ |
|
119 struct module *module /**< the device's module */ |
|
120 ) |
|
121 { |
|
122 ec_device_detach(device); // resets fields |
|
123 |
66 device->dev = net_dev; |
124 device->dev = net_dev; |
67 device->poll = poll; |
125 device->poll = poll; |
68 device->module = module; |
126 device->module = module; |
69 |
127 |
|
128 device->tx_skb->dev = net_dev; |
|
129 memcpy(device->eth->h_source, net_dev->dev_addr, ETH_ALEN); |
|
130 } |
|
131 |
|
132 /*****************************************************************************/ |
|
133 |
|
134 /** |
|
135 Disconnect from net_device. |
|
136 */ |
|
137 |
|
138 void ec_device_detach(ec_device_t *device /**< EtherCAT device */) |
|
139 { |
|
140 device->dev = NULL; |
|
141 device->poll = NULL; |
|
142 device->module = NULL; |
70 device->open = 0; |
143 device->open = 0; |
71 device->link_state = 0; // down |
144 device->link_state = 0; // down |
72 |
|
73 device->tx_count = 0; |
145 device->tx_count = 0; |
74 device->rx_count = 0; |
146 device->rx_count = 0; |
75 |
147 device->tx_skb->dev = NULL; |
76 #ifdef EC_DBG_IF |
|
77 if (ec_debug_init(&device->dbg)) { |
|
78 EC_ERR("Failed to init debug device!\n"); |
|
79 goto out_return; |
|
80 } |
|
81 #endif |
|
82 |
|
83 if (!(device->tx_skb = dev_alloc_skb(ETH_FRAME_LEN))) { |
|
84 EC_ERR("Error allocating device socket buffer!\n"); |
|
85 #ifdef EC_DBG_IF |
|
86 goto out_debug; |
|
87 #else |
|
88 goto out_return; |
|
89 #endif |
|
90 } |
|
91 |
|
92 device->tx_skb->dev = net_dev; |
|
93 |
|
94 // add Ethernet-II-header |
|
95 skb_reserve(device->tx_skb, ETH_HLEN); |
|
96 eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN); |
|
97 eth->h_proto = htons(0x88A4); |
|
98 memcpy(eth->h_source, net_dev->dev_addr, net_dev->addr_len); |
|
99 memset(eth->h_dest, 0xFF, net_dev->addr_len); |
|
100 |
|
101 return 0; |
|
102 |
|
103 #ifdef EC_DBG_IF |
|
104 out_debug: |
|
105 ec_debug_clear(&device->dbg); |
|
106 #endif |
|
107 out_return: |
|
108 return -1; |
|
109 } |
|
110 |
|
111 /*****************************************************************************/ |
|
112 |
|
113 /** |
|
114 EtherCAT device destuctor. |
|
115 */ |
|
116 |
|
117 void ec_device_clear(ec_device_t *device /**< EtherCAT device */) |
|
118 { |
|
119 if (device->open) ec_device_close(device); |
|
120 if (device->tx_skb) dev_kfree_skb(device->tx_skb); |
|
121 #ifdef EC_DBG_IF |
|
122 ec_debug_clear(&device->dbg); |
|
123 #endif |
|
124 } |
148 } |
125 |
149 |
126 /*****************************************************************************/ |
150 /*****************************************************************************/ |
127 |
151 |
128 /** |
152 /** |