.. | .. |
---|
122 | 122 | #define J1939_CAN_ID CAN_EFF_FLAG |
---|
123 | 123 | #define J1939_CAN_MASK (CAN_EFF_FLAG | CAN_RTR_FLAG) |
---|
124 | 124 | |
---|
125 | | -static DEFINE_SPINLOCK(j1939_netdev_lock); |
---|
| 125 | +static DEFINE_MUTEX(j1939_netdev_lock); |
---|
126 | 126 | |
---|
127 | 127 | static struct j1939_priv *j1939_priv_create(struct net_device *ndev) |
---|
128 | 128 | { |
---|
.. | .. |
---|
216 | 216 | j1939_can_rx_unregister(priv); |
---|
217 | 217 | j1939_ecu_unmap_all(priv); |
---|
218 | 218 | j1939_priv_set(priv->ndev, NULL); |
---|
219 | | - spin_unlock(&j1939_netdev_lock); |
---|
| 219 | + mutex_unlock(&j1939_netdev_lock); |
---|
220 | 220 | } |
---|
221 | 221 | |
---|
222 | 222 | /* get pointer to priv without increasing ref counter */ |
---|
.. | .. |
---|
244 | 244 | { |
---|
245 | 245 | struct j1939_priv *priv; |
---|
246 | 246 | |
---|
247 | | - spin_lock(&j1939_netdev_lock); |
---|
| 247 | + mutex_lock(&j1939_netdev_lock); |
---|
248 | 248 | priv = j1939_priv_get_by_ndev_locked(ndev); |
---|
249 | | - spin_unlock(&j1939_netdev_lock); |
---|
| 249 | + mutex_unlock(&j1939_netdev_lock); |
---|
250 | 250 | |
---|
251 | 251 | return priv; |
---|
252 | 252 | } |
---|
.. | .. |
---|
256 | 256 | struct j1939_priv *priv, *priv_new; |
---|
257 | 257 | int ret; |
---|
258 | 258 | |
---|
259 | | - spin_lock(&j1939_netdev_lock); |
---|
| 259 | + mutex_lock(&j1939_netdev_lock); |
---|
260 | 260 | priv = j1939_priv_get_by_ndev_locked(ndev); |
---|
261 | 261 | if (priv) { |
---|
262 | 262 | kref_get(&priv->rx_kref); |
---|
263 | | - spin_unlock(&j1939_netdev_lock); |
---|
| 263 | + mutex_unlock(&j1939_netdev_lock); |
---|
264 | 264 | return priv; |
---|
265 | 265 | } |
---|
266 | | - spin_unlock(&j1939_netdev_lock); |
---|
| 266 | + mutex_unlock(&j1939_netdev_lock); |
---|
267 | 267 | |
---|
268 | 268 | priv = j1939_priv_create(ndev); |
---|
269 | 269 | if (!priv) |
---|
.. | .. |
---|
273 | 273 | spin_lock_init(&priv->j1939_socks_lock); |
---|
274 | 274 | INIT_LIST_HEAD(&priv->j1939_socks); |
---|
275 | 275 | |
---|
276 | | - spin_lock(&j1939_netdev_lock); |
---|
| 276 | + mutex_lock(&j1939_netdev_lock); |
---|
277 | 277 | priv_new = j1939_priv_get_by_ndev_locked(ndev); |
---|
278 | 278 | if (priv_new) { |
---|
279 | 279 | /* Someone was faster than us, use their priv and roll |
---|
280 | 280 | * back our's. |
---|
281 | 281 | */ |
---|
282 | 282 | kref_get(&priv_new->rx_kref); |
---|
283 | | - spin_unlock(&j1939_netdev_lock); |
---|
| 283 | + mutex_unlock(&j1939_netdev_lock); |
---|
284 | 284 | dev_put(ndev); |
---|
285 | 285 | kfree(priv); |
---|
286 | 286 | return priv_new; |
---|
287 | 287 | } |
---|
288 | 288 | j1939_priv_set(ndev, priv); |
---|
289 | | - spin_unlock(&j1939_netdev_lock); |
---|
290 | 289 | |
---|
291 | 290 | ret = j1939_can_rx_register(priv); |
---|
292 | 291 | if (ret < 0) |
---|
293 | 292 | goto out_priv_put; |
---|
294 | 293 | |
---|
| 294 | + mutex_unlock(&j1939_netdev_lock); |
---|
295 | 295 | return priv; |
---|
296 | 296 | |
---|
297 | 297 | out_priv_put: |
---|
298 | 298 | j1939_priv_set(ndev, NULL); |
---|
| 299 | + mutex_unlock(&j1939_netdev_lock); |
---|
| 300 | + |
---|
299 | 301 | dev_put(ndev); |
---|
300 | 302 | kfree(priv); |
---|
301 | 303 | |
---|
.. | .. |
---|
304 | 306 | |
---|
305 | 307 | void j1939_netdev_stop(struct j1939_priv *priv) |
---|
306 | 308 | { |
---|
307 | | - kref_put_lock(&priv->rx_kref, __j1939_rx_release, &j1939_netdev_lock); |
---|
| 309 | + kref_put_mutex(&priv->rx_kref, __j1939_rx_release, &j1939_netdev_lock); |
---|
308 | 310 | j1939_priv_put(priv); |
---|
309 | 311 | } |
---|
310 | 312 | |
---|