struct mt76x2_dev *mt76x2_alloc_device(struct device *pdev) { static const struct mt76_driver_ops drv_ops = { .txwi_size = sizeof(struct mt76x2_txwi), .tx_prepare_skb = mt76x2_tx_prepare_skb, .tx_complete_skb = mt76x2_tx_complete_skb, .rx_skb = mt76x2_queue_rx_skb, .rx_poll_complete = mt76x2_rx_poll_complete, }; struct ieee80211_hw *hw; struct mt76x2_dev *dev; hw = ieee80211_alloc_hw(sizeof(*dev), &mt76x2_ops); if (!hw) return NULL; dev = hw->priv; dev->mt76.dev = pdev; dev->mt76.hw = hw; dev->mt76.drv = &drv_ops; mutex_init(&dev->mutex); spin_lock_init(&dev->irq_lock); return dev; } #define CCK_RATE(_idx, _rate) { \ .bitrate = _rate, \ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \ .hw_value = (MT_PHY_TYPE_CCK << 8) | _idx, \ .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (8 + _idx), \ } #define OFDM_RATE(_idx, _rate) { \ .bitrate = _rate, \ .hw_value = (MT_PHY_TYPE_OFDM << 8) | _idx, \ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | _idx, \ } static struct ieee80211_rate mt76x2_rates[] = { CCK_RATE(0, 10), CCK_RATE(1, 20), CCK_RATE(2, 55), CCK_RATE(3, 110), OFDM_RATE(0, 60), OFDM_RATE(1, 90), OFDM_RATE(2, 120), OFDM_RATE(3, 180), OFDM_RATE(4, 240), OFDM_RATE(5, 360), OFDM_RATE(6, 480), OFDM_RATE(7, 540), }; static const struct ieee80211_iface_limit if_limits[] = { { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) }, { .max = 8,
#define CCK_RATE(_idx, _rate) { \ .bitrate = _rate, \ .flags = IEEE80211_RATE_SHORT_PREAMBLE, \ .hw_value = (MT_PHY_TYPE_CCK << 8) | _idx, \ .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (8 + _idx), \ } #define OFDM_RATE(_idx, _rate) { \ .bitrate = _rate, \ .hw_value = (MT_PHY_TYPE_OFDM << 8) | _idx, \ .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | _idx, \ } static struct ieee80211_rate mt76_rates[] = { CCK_RATE(0, 10), CCK_RATE(1, 20), CCK_RATE(2, 55), CCK_RATE(3, 110), OFDM_RATE(0, 60), OFDM_RATE(1, 90), OFDM_RATE(2, 120), OFDM_RATE(3, 180), OFDM_RATE(4, 240), OFDM_RATE(5, 360), OFDM_RATE(6, 480), OFDM_RATE(7, 540), }; static int mt76_init_sband(struct mt76_dev *dev, struct ieee80211_supported_band *sband,