Date:2011-06-18 08:49:23 (12 years 9 months ago)
Author:Werner Almesberger
Commit:865150344f379e5bb5840f3f490f5b577d16c0e5
Message:at86rf230.c: synchronized with latest changes from linux-zigbee

Files: drivers/ieee802154/at86rf230.c (10 diffs)

Change Details

drivers/ieee802154/at86rf230.c
208208        .len = 2,
209209        .tx_buf = buf,
210210        .rx_buf = buf,
211
211    };
212    struct spi_transfer xfer_head1 = {
213        .len = 2,
214        .tx_buf = buf,
215        .rx_buf = buf,
212216    };
213217    struct spi_transfer xfer_buf = {
214        .len = *len,
218        .len = 0,
215219        .rx_buf = data,
216220    };
217221
218222    mutex_lock(&lp->bmux);
223
219224    buf[0] = CMD_FB;
220225    buf[1] = 0x00;
221226
222    dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]);
223    dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]);
224
225227    spi_message_init(&msg);
226228    spi_message_add_tail(&xfer_head, &msg);
227    spi_message_add_tail(&xfer_buf, &msg);
228229
229230    status = spi_sync(lp->spi, &msg);
230231    dev_vdbg(&lp->spi->dev, "status = %d\n", status);
232
233    xfer_buf.len = *(buf + 1) + 1;
234    *len = buf[1];
235
236    buf[0] = CMD_FB;
237    buf[1] = 0x00;
238
239    spi_message_init(&msg);
240    spi_message_add_tail(&xfer_head1, &msg);
241    spi_message_add_tail(&xfer_buf, &msg);
242
243    status = spi_sync(lp->spi, &msg);
244
231245    if (msg.status)
232246        status = msg.status;
233247    dev_vdbg(&lp->spi->dev, "status = %d\n", status);
...... 
237251    if (!status) {
238252        if (lqi && *len > lp->buf[1])
239253            *lqi = data[lp->buf[1]];
240
241        *len = lp->buf[1];
242254    }
243255
244256    mutex_unlock(&lp->bmux);
...... 
257269}
258270
259271static int
260at86rf230_state(struct ieee802154_dev *dev, int cmd, int state)
272at86rf230_state(struct ieee802154_dev *dev, int state)
261273{
262274    struct at86rf230_local *lp = dev->priv;
263275    int rc;
264276    u8 val;
277    u8 desired_status;
265278
266279    pr_debug("%s %d\n", __func__/*, priv->cur_state*/, state);
267280    might_sleep();
268281
282    if (state == STATE_FORCE_TX_ON)
283        desired_status = STATE_TX_ON;
284    else if (state == STATE_FORCE_TRX_OFF)
285        desired_status = STATE_TRX_OFF;
286    else
287        desired_status = state;
288
269289    do {
270290        rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &val);
271291        if (rc)
...... 
273293        pr_debug("%s val1 = %x\n", __func__, val);
274294    } while (val == STATE_TRANSITION_IN_PROGRESS);
275295
276    if (val == state)
296    if (val == desired_status)
277297        return 0;
278298
279    /* state is equal to phy states, except for "forced" transitions */
280    rc = at86rf230_write_subreg(lp, SR_TRX_CMD, cmd);
299    /* state is equal to phy states */
300    rc = at86rf230_write_subreg(lp, SR_TRX_CMD, state);
281301    if (rc)
282302        goto err;
283303
...... 
288308        pr_debug("%s val2 = %x\n", __func__, val);
289309    } while (val == STATE_TRANSITION_IN_PROGRESS);
290310
291    if (val == state)
311
312    if (val == desired_status)
292313        return 0;
293314
315    pr_err("%s unexpected state change: %d, asked for %d\n", __func__,
316            val, state);
294317    return -EBUSY;
295318
296319err:
...... 
301324static int
302325at86rf230_start(struct ieee802154_dev *dev)
303326{
304    return at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON);
327    struct at86rf230_local *lp = dev->priv;
328    u8 rc;
329
330    rc = at86rf230_write_subreg(lp, SR_RX_SAFE_MODE, 1);
331    if (rc)
332        return rc;
333    return at86rf230_state(dev, STATE_RX_ON);
305334}
306335
307336static void
308337at86rf230_stop(struct ieee802154_dev *dev)
309338{
310    at86rf230_state(dev, STATE_FORCE_TRX_OFF, STATE_TRX_OFF);
339    at86rf230_state(dev, STATE_FORCE_TRX_OFF);
311340}
312341
313342static int
...... 
334363at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb)
335364{
336365    struct at86rf230_local *lp = dev->priv;
337    int rc;
366    int rc, rc2;
338367
339368    pr_debug("%s\n", __func__);
340369
341370    might_sleep();
342371
343372    BUG_ON(lp->is_tx);
344
345373    INIT_COMPLETION(lp->tx_complete);
346374
347    rc = at86rf230_state(dev, STATE_FORCE_TX_ON, STATE_TX_ON);
375    rc = at86rf230_state(dev, STATE_FORCE_TX_ON);
348376    if (rc)
349377        goto err;
350378
...... 
369397
370398    rc = wait_for_completion_interruptible(&lp->tx_complete);
371399    if (rc < 0)
372        at86rf230_state(dev, STATE_FORCE_TX_ON, STATE_TX_ON);
400        at86rf230_state(dev, STATE_FORCE_TX_ON);
373401
374402err_rx:
375    at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON);
403    rc2 = at86rf230_start(dev);
404    if (!rc)
405        rc = rc2;
376406err:
407    if (rc)
408        pr_err("%s error: %d\n", __func__, rc);
377409    lp->is_tx = 0;
378410
379411    return rc;
...... 
381413
382414static int at86rf230_rx(struct at86rf230_local *lp)
383415{
384    u8 len = 128;
385    u8 lqi = 0;
416    u8 len = 128, lqi = 0;
386417    int rc;
387418    struct sk_buff *skb;
388419
...... 
390421    if (!skb)
391422        return -ENOMEM;
392423
424    /* FIXME: process return status */
425    rc = at86rf230_write_subreg(lp, SR_RX_PDT_DIS, 1);
393426    rc = at86rf230_read_fbuf(lp, skb_put(skb, len), &len, &lqi);
394    if (len < 2) {
395        kfree_skb(skb);
396        return -EINVAL;
397    }
427    rc = at86rf230_write_subreg(lp, SR_RX_SAFE_MODE, 1);
428    rc = at86rf230_write_subreg(lp, SR_RX_PDT_DIS, 0);
429
430    if (len < 2)
431        goto err;
398432
399433    skb_trim(skb, len-2); /* We do not put CRC into the frame */
400434
401    if (len < 2) {
402        kfree_skb(skb);
403        return -EINVAL;
404    }
405435
406436    ieee802154_rx_irqsafe(lp->dev, skb, lqi);
407437
408438    dev_dbg(&lp->spi->dev, "READ_FBUF: %d %d %x\n", rc, len, lqi);
409439
410440    return 0;
441err:
442    pr_debug("%s: received frame is too small\n", __func__);
443
444    kfree_skb(skb);
445    return -EINVAL;
411446}
412447
413448static struct ieee802154_ops at86rf230_ops = {

Archive Download the corresponding diff file



interactive