Lines Matching refs:devrec
545 struct mrf24j40 *devrec = context; in write_tx_buf_complete() local
546 __le16 fc = ieee802154_get_fc_from_skb(devrec->tx_skb); in write_tx_buf_complete()
553 devrec->tx_post_msg.complete = NULL; in write_tx_buf_complete()
554 devrec->tx_post_buf[0] = MRF24J40_WRITESHORT(REG_TXNCON); in write_tx_buf_complete()
555 devrec->tx_post_buf[1] = val; in write_tx_buf_complete()
557 ret = spi_async(devrec->spi, &devrec->tx_post_msg); in write_tx_buf_complete()
559 dev_err(printdev(devrec), "SPI write Failed for transmit buf\n"); in write_tx_buf_complete()
565 static int write_tx_buf(struct mrf24j40 *devrec, u16 reg, in write_tx_buf() argument
573 …dev_err(printdev(devrec), "write_tx_buf() was passed too large a buffer. Performing short write.\n… in write_tx_buf()
578 devrec->tx_hdr_buf[0] = cmd >> 8 & 0xff; in write_tx_buf()
579 devrec->tx_hdr_buf[1] = cmd & 0xff; in write_tx_buf()
580 devrec->tx_len_buf[0] = 0x0; /* Header Length. Set to 0 for now. TODO */ in write_tx_buf()
581 devrec->tx_len_buf[1] = length; /* Total length */ in write_tx_buf()
582 devrec->tx_buf_trx.tx_buf = data; in write_tx_buf()
583 devrec->tx_buf_trx.len = length; in write_tx_buf()
585 ret = spi_async(devrec->spi, &devrec->tx_msg); in write_tx_buf()
587 dev_err(printdev(devrec), "SPI write Failed for TX buf\n"); in write_tx_buf()
594 struct mrf24j40 *devrec = hw->priv; in mrf24j40_tx() local
596 dev_dbg(printdev(devrec), "tx packet of %d bytes\n", skb->len); in mrf24j40_tx()
597 devrec->tx_skb = skb; in mrf24j40_tx()
599 return write_tx_buf(devrec, 0x000, skb->data, skb->len); in mrf24j40_tx()
612 struct mrf24j40 *devrec = hw->priv; in mrf24j40_start() local
614 dev_dbg(printdev(devrec), "start\n"); in mrf24j40_start()
617 return regmap_update_bits(devrec->regmap_short, REG_INTCON, in mrf24j40_start()
623 struct mrf24j40 *devrec = hw->priv; in mrf24j40_stop() local
625 dev_dbg(printdev(devrec), "stop\n"); in mrf24j40_stop()
628 regmap_update_bits(devrec->regmap_short, REG_INTCON, in mrf24j40_stop()
634 struct mrf24j40 *devrec = hw->priv; in mrf24j40_set_channel() local
638 dev_dbg(printdev(devrec), "Set Channel %d\n", channel); in mrf24j40_set_channel()
646 ret = regmap_update_bits(devrec->regmap_long, REG_RFCON0, in mrf24j40_set_channel()
652 ret = regmap_update_bits(devrec->regmap_short, REG_RFCTL, BIT_RFRST, in mrf24j40_set_channel()
657 ret = regmap_update_bits(devrec->regmap_short, REG_RFCTL, BIT_RFRST, 0); in mrf24j40_set_channel()
668 struct mrf24j40 *devrec = hw->priv; in mrf24j40_filter() local
670 dev_dbg(printdev(devrec), "filter\n"); in mrf24j40_filter()
679 regmap_write(devrec->regmap_short, REG_SADRH, addrh); in mrf24j40_filter()
680 regmap_write(devrec->regmap_short, REG_SADRL, addrl); in mrf24j40_filter()
681 dev_dbg(printdev(devrec), in mrf24j40_filter()
691 regmap_write(devrec->regmap_short, REG_EADR0 + i, in mrf24j40_filter()
708 regmap_write(devrec->regmap_short, REG_PANIDH, panidh); in mrf24j40_filter()
709 regmap_write(devrec->regmap_short, REG_PANIDL, panidl); in mrf24j40_filter()
711 dev_dbg(printdev(devrec), "Set PANID to %04hx\n", filt->pan_id); in mrf24j40_filter()
723 ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR, in mrf24j40_filter()
732 dev_dbg(printdev(devrec), "Set Pan Coord to %s\n", in mrf24j40_filter()
739 static void mrf24j40_handle_rx_read_buf_unlock(struct mrf24j40 *devrec) in mrf24j40_handle_rx_read_buf_unlock() argument
744 devrec->rx_msg.complete = NULL; in mrf24j40_handle_rx_read_buf_unlock()
745 devrec->rx_buf[0] = MRF24J40_WRITESHORT(REG_BBREG1); in mrf24j40_handle_rx_read_buf_unlock()
746 devrec->rx_buf[1] = 0x00; /* CLR RXDECINV */ in mrf24j40_handle_rx_read_buf_unlock()
747 ret = spi_async(devrec->spi, &devrec->rx_msg); in mrf24j40_handle_rx_read_buf_unlock()
749 dev_err(printdev(devrec), "failed to unlock rx buffer\n"); in mrf24j40_handle_rx_read_buf_unlock()
754 struct mrf24j40 *devrec = context; in mrf24j40_handle_rx_read_buf_complete() local
755 u8 len = devrec->rx_buf[2]; in mrf24j40_handle_rx_read_buf_complete()
759 memcpy(rx_local_buf, devrec->rx_fifo_buf, len); in mrf24j40_handle_rx_read_buf_complete()
760 mrf24j40_handle_rx_read_buf_unlock(devrec); in mrf24j40_handle_rx_read_buf_complete()
764 dev_err(printdev(devrec), "failed to allocate skb\n"); in mrf24j40_handle_rx_read_buf_complete()
769 ieee802154_rx_irqsafe(devrec->hw, skb, 0); in mrf24j40_handle_rx_read_buf_complete()
775 devrec->rx_lqi_buf[0], devrec->rx_lqi_buf[1]); in mrf24j40_handle_rx_read_buf_complete()
781 struct mrf24j40 *devrec = context; in mrf24j40_handle_rx_read_buf() local
786 if (!ieee802154_is_valid_psdu_len(devrec->rx_buf[2])) in mrf24j40_handle_rx_read_buf()
787 devrec->rx_buf[2] = IEEE802154_MTU; in mrf24j40_handle_rx_read_buf()
790 devrec->rx_addr_buf[0] = cmd >> 8 & 0xff; in mrf24j40_handle_rx_read_buf()
791 devrec->rx_addr_buf[1] = cmd & 0xff; in mrf24j40_handle_rx_read_buf()
792 devrec->rx_fifo_buf_trx.len = devrec->rx_buf[2]; in mrf24j40_handle_rx_read_buf()
793 ret = spi_async(devrec->spi, &devrec->rx_buf_msg); in mrf24j40_handle_rx_read_buf()
795 dev_err(printdev(devrec), "failed to read rx buffer\n"); in mrf24j40_handle_rx_read_buf()
796 mrf24j40_handle_rx_read_buf_unlock(devrec); in mrf24j40_handle_rx_read_buf()
802 struct mrf24j40 *devrec = context; in mrf24j40_handle_rx_read_len() local
807 devrec->rx_msg.complete = mrf24j40_handle_rx_read_buf; in mrf24j40_handle_rx_read_len()
808 devrec->rx_trx.len = 3; in mrf24j40_handle_rx_read_len()
810 devrec->rx_buf[0] = cmd >> 8 & 0xff; in mrf24j40_handle_rx_read_len()
811 devrec->rx_buf[1] = cmd & 0xff; in mrf24j40_handle_rx_read_len()
813 ret = spi_async(devrec->spi, &devrec->rx_msg); in mrf24j40_handle_rx_read_len()
815 dev_err(printdev(devrec), "failed to read rx buffer length\n"); in mrf24j40_handle_rx_read_len()
816 mrf24j40_handle_rx_read_buf_unlock(devrec); in mrf24j40_handle_rx_read_len()
820 static int mrf24j40_handle_rx(struct mrf24j40 *devrec) in mrf24j40_handle_rx() argument
825 devrec->rx_msg.complete = mrf24j40_handle_rx_read_len; in mrf24j40_handle_rx()
826 devrec->rx_trx.len = 2; in mrf24j40_handle_rx()
827 devrec->rx_buf[0] = MRF24J40_WRITESHORT(REG_BBREG1); in mrf24j40_handle_rx()
828 devrec->rx_buf[1] = BIT_RXDECINV; /* SET RXDECINV */ in mrf24j40_handle_rx()
830 return spi_async(devrec->spi, &devrec->rx_msg); in mrf24j40_handle_rx()
837 struct mrf24j40 *devrec = hw->priv; in mrf24j40_csma_params() local
845 return regmap_update_bits(devrec->regmap_short, REG_TXMCR, in mrf24j40_csma_params()
853 struct mrf24j40 *devrec = hw->priv; in mrf24j40_set_cca_mode() local
877 return regmap_update_bits(devrec->regmap_short, REG_BBREG2, in mrf24j40_set_cca_mode()
912 struct mrf24j40 *devrec = hw->priv; in mrf24j40_set_cca_ed_level() local
917 return regmap_write(devrec->regmap_short, REG_CCAEDTH, in mrf24j40_set_cca_ed_level()
932 struct mrf24j40 *devrec = hw->priv; in mrf24j40_set_txpower() local
981 return regmap_update_bits(devrec->regmap_long, REG_RFCON3, in mrf24j40_set_txpower()
987 struct mrf24j40 *devrec = hw->priv; in mrf24j40_set_promiscuous_mode() local
992 ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR, in mrf24j40_set_promiscuous_mode()
997 ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR, in mrf24j40_set_promiscuous_mode()
1022 struct mrf24j40 *devrec = context; in mrf24j40_intstat_complete() local
1023 u8 intstat = devrec->irq_buf[1]; in mrf24j40_intstat_complete()
1025 enable_irq(devrec->spi->irq); in mrf24j40_intstat_complete()
1029 ieee802154_xmit_complete(devrec->hw, devrec->tx_skb, false); in mrf24j40_intstat_complete()
1033 mrf24j40_handle_rx(devrec); in mrf24j40_intstat_complete()
1038 struct mrf24j40 *devrec = data; in mrf24j40_isr() local
1043 devrec->irq_buf[0] = MRF24J40_READSHORT(REG_INTSTAT); in mrf24j40_isr()
1045 ret = spi_async(devrec->spi, &devrec->irq_msg); in mrf24j40_isr()
1054 static int mrf24j40_hw_init(struct mrf24j40 *devrec) in mrf24j40_hw_init() argument
1061 ret = regmap_write(devrec->regmap_short, REG_SOFTRST, 0x07); in mrf24j40_hw_init()
1065 ret = regmap_write(devrec->regmap_short, REG_PACON2, 0x98); in mrf24j40_hw_init()
1069 ret = regmap_write(devrec->regmap_short, REG_TXSTBL, 0x95); in mrf24j40_hw_init()
1073 ret = regmap_write(devrec->regmap_long, REG_RFCON0, 0x03); in mrf24j40_hw_init()
1077 ret = regmap_write(devrec->regmap_long, REG_RFCON1, 0x01); in mrf24j40_hw_init()
1081 ret = regmap_write(devrec->regmap_long, REG_RFCON2, 0x80); in mrf24j40_hw_init()
1085 ret = regmap_write(devrec->regmap_long, REG_RFCON6, 0x90); in mrf24j40_hw_init()
1089 ret = regmap_write(devrec->regmap_long, REG_RFCON7, 0x80); in mrf24j40_hw_init()
1093 ret = regmap_write(devrec->regmap_long, REG_RFCON8, 0x10); in mrf24j40_hw_init()
1097 ret = regmap_write(devrec->regmap_long, REG_SLPCON1, 0x21); in mrf24j40_hw_init()
1101 ret = regmap_write(devrec->regmap_short, REG_BBREG2, 0x80); in mrf24j40_hw_init()
1105 ret = regmap_write(devrec->regmap_short, REG_CCAEDTH, 0x60); in mrf24j40_hw_init()
1109 ret = regmap_write(devrec->regmap_short, REG_BBREG6, 0x40); in mrf24j40_hw_init()
1113 ret = regmap_write(devrec->regmap_short, REG_RFCTL, 0x04); in mrf24j40_hw_init()
1117 ret = regmap_write(devrec->regmap_short, REG_RFCTL, 0x0); in mrf24j40_hw_init()
1124 ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR, 0x03, 0x00); in mrf24j40_hw_init()
1128 if (spi_get_device_id(devrec->spi)->driver_data == MRF24J40MC) { in mrf24j40_hw_init()
1132 regmap_update_bits(devrec->regmap_long, REG_TESTMODE, 0x07, in mrf24j40_hw_init()
1136 regmap_update_bits(devrec->regmap_short, REG_TRISGPIO, 0x08, in mrf24j40_hw_init()
1140 regmap_update_bits(devrec->regmap_short, REG_GPIO, 0x08, 0x08); in mrf24j40_hw_init()
1145 regmap_write(devrec->regmap_long, REG_RFCON3, 0x28); in mrf24j40_hw_init()
1148 irq_type = irq_get_trigger_type(devrec->spi->irq); in mrf24j40_hw_init()
1151 dev_warn(&devrec->spi->dev, in mrf24j40_hw_init()
1157 ret = regmap_update_bits(devrec->regmap_long, REG_SLPCON0, in mrf24j40_hw_init()
1174 mrf24j40_setup_tx_spi_messages(struct mrf24j40 *devrec) in mrf24j40_setup_tx_spi_messages() argument
1176 spi_message_init(&devrec->tx_msg); in mrf24j40_setup_tx_spi_messages()
1177 devrec->tx_msg.context = devrec; in mrf24j40_setup_tx_spi_messages()
1178 devrec->tx_msg.complete = write_tx_buf_complete; in mrf24j40_setup_tx_spi_messages()
1179 devrec->tx_hdr_trx.len = 2; in mrf24j40_setup_tx_spi_messages()
1180 devrec->tx_hdr_trx.tx_buf = devrec->tx_hdr_buf; in mrf24j40_setup_tx_spi_messages()
1181 spi_message_add_tail(&devrec->tx_hdr_trx, &devrec->tx_msg); in mrf24j40_setup_tx_spi_messages()
1182 devrec->tx_len_trx.len = 2; in mrf24j40_setup_tx_spi_messages()
1183 devrec->tx_len_trx.tx_buf = devrec->tx_len_buf; in mrf24j40_setup_tx_spi_messages()
1184 spi_message_add_tail(&devrec->tx_len_trx, &devrec->tx_msg); in mrf24j40_setup_tx_spi_messages()
1185 spi_message_add_tail(&devrec->tx_buf_trx, &devrec->tx_msg); in mrf24j40_setup_tx_spi_messages()
1187 spi_message_init(&devrec->tx_post_msg); in mrf24j40_setup_tx_spi_messages()
1188 devrec->tx_post_msg.context = devrec; in mrf24j40_setup_tx_spi_messages()
1189 devrec->tx_post_trx.len = 2; in mrf24j40_setup_tx_spi_messages()
1190 devrec->tx_post_trx.tx_buf = devrec->tx_post_buf; in mrf24j40_setup_tx_spi_messages()
1191 spi_message_add_tail(&devrec->tx_post_trx, &devrec->tx_post_msg); in mrf24j40_setup_tx_spi_messages()
1195 mrf24j40_setup_rx_spi_messages(struct mrf24j40 *devrec) in mrf24j40_setup_rx_spi_messages() argument
1197 spi_message_init(&devrec->rx_msg); in mrf24j40_setup_rx_spi_messages()
1198 devrec->rx_msg.context = devrec; in mrf24j40_setup_rx_spi_messages()
1199 devrec->rx_trx.len = 2; in mrf24j40_setup_rx_spi_messages()
1200 devrec->rx_trx.tx_buf = devrec->rx_buf; in mrf24j40_setup_rx_spi_messages()
1201 devrec->rx_trx.rx_buf = devrec->rx_buf; in mrf24j40_setup_rx_spi_messages()
1202 spi_message_add_tail(&devrec->rx_trx, &devrec->rx_msg); in mrf24j40_setup_rx_spi_messages()
1204 spi_message_init(&devrec->rx_buf_msg); in mrf24j40_setup_rx_spi_messages()
1205 devrec->rx_buf_msg.context = devrec; in mrf24j40_setup_rx_spi_messages()
1206 devrec->rx_buf_msg.complete = mrf24j40_handle_rx_read_buf_complete; in mrf24j40_setup_rx_spi_messages()
1207 devrec->rx_addr_trx.len = 2; in mrf24j40_setup_rx_spi_messages()
1208 devrec->rx_addr_trx.tx_buf = devrec->rx_addr_buf; in mrf24j40_setup_rx_spi_messages()
1209 spi_message_add_tail(&devrec->rx_addr_trx, &devrec->rx_buf_msg); in mrf24j40_setup_rx_spi_messages()
1210 devrec->rx_fifo_buf_trx.rx_buf = devrec->rx_fifo_buf; in mrf24j40_setup_rx_spi_messages()
1211 spi_message_add_tail(&devrec->rx_fifo_buf_trx, &devrec->rx_buf_msg); in mrf24j40_setup_rx_spi_messages()
1212 devrec->rx_lqi_trx.len = 2; in mrf24j40_setup_rx_spi_messages()
1213 devrec->rx_lqi_trx.rx_buf = devrec->rx_lqi_buf; in mrf24j40_setup_rx_spi_messages()
1214 spi_message_add_tail(&devrec->rx_lqi_trx, &devrec->rx_buf_msg); in mrf24j40_setup_rx_spi_messages()
1218 mrf24j40_setup_irq_spi_messages(struct mrf24j40 *devrec) in mrf24j40_setup_irq_spi_messages() argument
1220 spi_message_init(&devrec->irq_msg); in mrf24j40_setup_irq_spi_messages()
1221 devrec->irq_msg.context = devrec; in mrf24j40_setup_irq_spi_messages()
1222 devrec->irq_msg.complete = mrf24j40_intstat_complete; in mrf24j40_setup_irq_spi_messages()
1223 devrec->irq_trx.len = 2; in mrf24j40_setup_irq_spi_messages()
1224 devrec->irq_trx.tx_buf = devrec->irq_buf; in mrf24j40_setup_irq_spi_messages()
1225 devrec->irq_trx.rx_buf = devrec->irq_buf; in mrf24j40_setup_irq_spi_messages()
1226 spi_message_add_tail(&devrec->irq_trx, &devrec->irq_msg); in mrf24j40_setup_irq_spi_messages()
1229 static void mrf24j40_phy_setup(struct mrf24j40 *devrec) in mrf24j40_phy_setup() argument
1231 ieee802154_random_extended_addr(&devrec->hw->phy->perm_extended_addr); in mrf24j40_phy_setup()
1232 devrec->hw->phy->current_channel = 11; in mrf24j40_phy_setup()
1235 devrec->hw->phy->supported.max_minbe = 3; in mrf24j40_phy_setup()
1239 devrec->hw->phy->supported.min_maxbe = 5; in mrf24j40_phy_setup()
1240 devrec->hw->phy->supported.max_maxbe = 5; in mrf24j40_phy_setup()
1242 devrec->hw->phy->cca.mode = NL802154_CCA_CARRIER; in mrf24j40_phy_setup()
1243 devrec->hw->phy->supported.cca_modes = BIT(NL802154_CCA_ENERGY) | in mrf24j40_phy_setup()
1246 devrec->hw->phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND); in mrf24j40_phy_setup()
1248 devrec->hw->phy->cca_ed_level = -6900; in mrf24j40_phy_setup()
1249 devrec->hw->phy->supported.cca_ed_levels = mrf24j40_ed_levels; in mrf24j40_phy_setup()
1250 devrec->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(mrf24j40_ed_levels); in mrf24j40_phy_setup()
1252 switch (spi_get_device_id(devrec->spi)->driver_data) { in mrf24j40_phy_setup()
1255 devrec->hw->phy->supported.tx_powers = mrf24j40ma_powers; in mrf24j40_phy_setup()
1256 devrec->hw->phy->supported.tx_powers_size = ARRAY_SIZE(mrf24j40ma_powers); in mrf24j40_phy_setup()
1257 devrec->hw->phy->flags |= WPAN_PHY_FLAG_TXPOWER; in mrf24j40_phy_setup()
1268 struct mrf24j40 *devrec; in mrf24j40_probe() local
1274 hw = ieee802154_alloc_hw(sizeof(*devrec), &mrf24j40_ops); in mrf24j40_probe()
1278 devrec = hw->priv; in mrf24j40_probe()
1279 devrec->spi = spi; in mrf24j40_probe()
1280 spi_set_drvdata(spi, devrec); in mrf24j40_probe()
1281 devrec->hw = hw; in mrf24j40_probe()
1282 devrec->hw->parent = &spi->dev; in mrf24j40_probe()
1283 devrec->hw->phy->supported.channels[0] = CHANNEL_MASK; in mrf24j40_probe()
1284 devrec->hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT | in mrf24j40_probe()
1288 devrec->hw->phy->flags = WPAN_PHY_FLAG_CCA_MODE | in mrf24j40_probe()
1291 mrf24j40_setup_tx_spi_messages(devrec); in mrf24j40_probe()
1292 mrf24j40_setup_rx_spi_messages(devrec); in mrf24j40_probe()
1293 mrf24j40_setup_irq_spi_messages(devrec); in mrf24j40_probe()
1295 devrec->regmap_short = devm_regmap_init_spi(spi, in mrf24j40_probe()
1297 if (IS_ERR(devrec->regmap_short)) { in mrf24j40_probe()
1298 ret = PTR_ERR(devrec->regmap_short); in mrf24j40_probe()
1304 devrec->regmap_long = devm_regmap_init(&spi->dev, in mrf24j40_probe()
1307 if (IS_ERR(devrec->regmap_long)) { in mrf24j40_probe()
1308 ret = PTR_ERR(devrec->regmap_long); in mrf24j40_probe()
1320 ret = mrf24j40_hw_init(devrec); in mrf24j40_probe()
1324 mrf24j40_phy_setup(devrec); in mrf24j40_probe()
1332 irq_type, dev_name(&spi->dev), devrec); in mrf24j40_probe()
1334 dev_err(printdev(devrec), "Unable to get IRQ"); in mrf24j40_probe()
1338 dev_dbg(printdev(devrec), "registered mrf24j40\n"); in mrf24j40_probe()
1339 ret = ieee802154_register_hw(devrec->hw); in mrf24j40_probe()
1346 ieee802154_free_hw(devrec->hw); in mrf24j40_probe()
1353 struct mrf24j40 *devrec = spi_get_drvdata(spi); in mrf24j40_remove() local
1355 dev_dbg(printdev(devrec), "remove\n"); in mrf24j40_remove()
1357 ieee802154_unregister_hw(devrec->hw); in mrf24j40_remove()
1358 ieee802154_free_hw(devrec->hw); in mrf24j40_remove()