On 13.12.2013 01:46, Hauke Mehrtens wrote:
> On 12/12/2013 10:27 AM, Stefan Assmann wrote:
>> - backport ethtool_cmd
>> - backport ethtool_ops
>> - backport mmd_eee_adv_to_ethtool_adv_t
>> - add patches/collateral-evolutions/network/82-ethernet/igb_ptp.patch
>> - add patches/collateral-evolutions/network/82-ethernet/igb_err_handler.patch
>>
>> Signed-off-by: Stefan Assmann <[email protected]>
>> ---

[...]

>> +struct backport_ethtool_ops {
>> +    int     (*get_settings)(struct net_device *, struct ethtool_cmd *);
>> +    int     (*set_settings)(struct net_device *, struct ethtool_cmd *);
>> +    void    (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
>> +    int     (*get_regs_len)(struct net_device *);
>> +    void    (*get_regs)(struct net_device *, struct ethtool_regs *, void *);
>> +    void    (*get_wol)(struct net_device *, struct ethtool_wolinfo *);
>> +    int     (*set_wol)(struct net_device *, struct ethtool_wolinfo *);
>> +    u32     (*get_msglevel)(struct net_device *);
>> +    void    (*set_msglevel)(struct net_device *, u32);
>> +    int     (*nway_reset)(struct net_device *);
>> +    u32     (*get_link)(struct net_device *);
>> +    int     (*get_eeprom_len)(struct net_device *);
>> +    int     (*get_eeprom)(struct net_device *,
>> +                          struct ethtool_eeprom *, u8 *);
>> +    int     (*set_eeprom)(struct net_device *,
>> +                          struct ethtool_eeprom *, u8 *);
>> +    int     (*get_coalesce)(struct net_device *, struct ethtool_coalesce *);
>> +    int     (*set_coalesce)(struct net_device *, struct ethtool_coalesce *);
>> +    void    (*get_ringparam)(struct net_device *,
>> +                             struct ethtool_ringparam *);
>> +    int     (*set_ringparam)(struct net_device *,
>> +                             struct ethtool_ringparam *);
>> +    void    (*get_pauseparam)(struct net_device *,
>> +                              struct ethtool_pauseparam*);
>> +    int     (*set_pauseparam)(struct net_device *,
>> +                              struct ethtool_pauseparam*);
>> +    void    (*self_test)(struct net_device *, struct ethtool_test *, u64 *);
>> +    void    (*get_strings)(struct net_device *, u32 stringset, u8 *);
>> +    int     (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state);
>> +    void    (*get_ethtool_stats)(struct net_device *,
>> +                                 struct ethtool_stats *, u64 *);
>> +    int     (*begin)(struct net_device *);
>> +    void    (*complete)(struct net_device *);
>> +    u32     (*get_priv_flags)(struct net_device *);
>> +    int     (*set_priv_flags)(struct net_device *, u32);
>> +    int     (*get_sset_count)(struct net_device *, int);
>> +    int     (*get_rxnfc)(struct net_device *,
>> +                         struct ethtool_rxnfc *, u32 *rule_locs);
>> +    int     (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *);
>> +    int     (*flash_device)(struct net_device *, struct ethtool_flash *);
>> +    int     (*reset)(struct net_device *, u32 *);
>> +    u32     (*get_rxfh_indir_size)(struct net_device *);
>> +    int     (*get_rxfh_indir)(struct net_device *, u32 *);
>> +    int     (*set_rxfh_indir)(struct net_device *, const u32 *);
>> +    void    (*get_channels)(struct net_device *, struct ethtool_channels *);
>> +    int     (*set_channels)(struct net_device *, struct ethtool_channels *);
>> +    int     (*get_dump_flag)(struct net_device *, struct ethtool_dump *);
>> +    int     (*get_dump_data)(struct net_device *,
>> +                             struct ethtool_dump *, void *);
>> +    int     (*set_dump)(struct net_device *, struct ethtool_dump *);
>> +    int     (*get_ts_info)(struct net_device *, struct ethtool_ts_info *);
>> +    int     (*get_module_info)(struct net_device *,
>> +                               struct ethtool_modinfo *);
>> +    int     (*get_module_eeprom)(struct net_device *,
>> +                                 struct ethtool_eeprom *, u8 *);
>> +    int     (*get_eee)(struct net_device *, struct ethtool_eee *);
>> +    int     (*set_eee)(struct net_device *, struct ethtool_eee *);
>> +};
>> +#define ethtool_ops LINUX_BACKPORT(ethtool_ops)
> 
> Backporting ethtool_ops does not work so easily. The network stack is in
> the old kernel which want to call some function with a pointer from this
> strcut, but it accesses this option not by its name but by the offset in
> this struct it was compiled with. If the kernel and backports are
> getting compiled with a different version of this struct then they could
> have a different opinion on where a certain function pointer is placed
> which will lead to the kernel calling the wrong function. You have to be
> careful when you want to change some structs in backports, this normally
> only works when all users of this strut are in backports.

I agree with you there, so what would be a better way to deal with
changes in struct ethtool_ops? We probably could ifdef out the code in
igb but I assume that would get very ugly rather quickly and would take a
lot of time to maintain and refresh patches against upstream. A solution
which keeps the changes to upstream minimal would be preferable if you
could think of any.

  Stefan
--
To unsubscribe from this list: send the line "unsubscribe backports" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to