On 2016-09-08 09:52, Sergey Ryazanov wrote:
>> +
>> +int mt76x2_register_device(struct mt76x2_dev *dev)
>> +{
>> +       struct ieee80211_hw *hw = mt76_hw(dev);
>> +       struct wiphy *wiphy = hw->wiphy;
>> +       void *status_fifo;
>> +       int fifo_size;
>> +       int i, ret;
>> +
>> +       fifo_size = roundup_pow_of_two(32 * sizeof(struct mt76x2_tx_status));
>> +       status_fifo = devm_kzalloc(dev->mt76.dev, fifo_size, GFP_KERNEL);
>> +       if (!status_fifo)
>> +               return -ENOMEM;
>> +
>> +       kfifo_init(&dev->txstatus_fifo, status_fifo, fifo_size);
>> +
>> +       ret = mt76x2_init_hardware(dev);
>> +       if (ret)
>> +               return ret;
>> +
>> +       hw->queues = 4;
>> +       hw->max_rates = 1;
>> +       hw->max_report_rates = 7;
>> +       hw->max_rate_tries = 1;
>> +       hw->extra_tx_headroom = 2;
>> +
>> +       hw->sta_data_size = sizeof(struct mt76x2_sta);
>> +       hw->vif_data_size = sizeof(struct mt76x2_vif);
>> +
>> +       for (i = 0; i < ARRAY_SIZE(dev->macaddr_list); i++) {
>> +               u8 *addr = dev->macaddr_list[i].addr;
>> +
>> +               memcpy(addr, dev->mt76.macaddr, ETH_ALEN);
>> +
>> +               if (!i)
>> +                       continue;
>> +
>> +               addr[0] |= BIT(1);
>> +               addr[0] ^= ((i - 1) << 2);
>> +       }
>> +       wiphy->addresses = dev->macaddr_list;
>> +       wiphy->n_addresses = ARRAY_SIZE(dev->macaddr_list);
>> +
>> +       wiphy->iface_combinations = if_comb;
>> +       wiphy->n_iface_combinations = ARRAY_SIZE(if_comb);
>> +
>> +       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
>> +
>> +       ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES);
>> +       INIT_DELAYED_WORK(&dev->cal_work, mt76x2_phy_calibrate);
>> +       INIT_DELAYED_WORK(&dev->mac_work, mt76x2_mac_work);
>> +
>> +       dev->mt76.sband_2g.sband.ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
>> +       dev->mt76.sband_5g.sband.ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
>> +
>> +       ret = mt76_register_device(&dev->mt76, true, mt76x2_rates,
>> +                                  ARRAY_SIZE(mt76x2_rates));
>> +       if (ret)
>> +               goto fail;
>> +
>> +       mt76x2_init_debugfs(dev);
>> +
>> +       return 0;
>> +
>> +fail:
>> +       mt76x2_stop_hardware(dev);
>> +       return ret;
>> +}
> 
> Just curious, almost full chip initialization performed in probe
> procedure, why not do that in start() callback? In such case we could
> fully restart chip without module reloading, just with ifdown/ifup
> circle.
Last time I tried that I ran into some weird chip quirks. I do think
it's a good idea but I'd rather see this merged first and try again to
rework it when I have some more time to figure out what's going on.

- Felix

Reply via email to