Commit ab65f649 authored by Kiran Divekar's avatar Kiran Divekar Committed by John W. Linville

libertas: fix misuse of netdev_priv() and dev->ml_priv

The mesh and radiotap interfaces need to use the same private data as
the main wifi interface.  If the main wifi interface uses netdev_priv(),
but the other interfaces ->ml_priv, there's no way to figure out where
the private data actually is in the WEXT handlers and netdevice
callbacks.  So make everything use ->ml_priv.

Fixes botched netdev_priv() conversion introduced by "netdevice
libertas: Fix directly reference of netdev->priv", though admittedly
libertas' use of ->priv was somewhat "special".
Signed-off-by: default avatarKiran Divekar <dkiran@marvell.com>
Acked-by: default avatarDan Williams <dcbw@redhat.com>
Tested-by: default avatarChris Ball <cjb@laptop.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 0c9a3aaa
...@@ -23,7 +23,7 @@ static const char * mesh_stat_strings[]= { ...@@ -23,7 +23,7 @@ static const char * mesh_stat_strings[]= {
static void lbs_ethtool_get_drvinfo(struct net_device *dev, static void lbs_ethtool_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info) struct ethtool_drvinfo *info)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
snprintf(info->fw_version, 32, "%u.%u.%u.p%u", snprintf(info->fw_version, 32, "%u.%u.%u.p%u",
priv->fwrelease >> 24 & 0xff, priv->fwrelease >> 24 & 0xff,
...@@ -47,7 +47,7 @@ static int lbs_ethtool_get_eeprom_len(struct net_device *dev) ...@@ -47,7 +47,7 @@ static int lbs_ethtool_get_eeprom_len(struct net_device *dev)
static int lbs_ethtool_get_eeprom(struct net_device *dev, static int lbs_ethtool_get_eeprom(struct net_device *dev,
struct ethtool_eeprom *eeprom, u8 * bytes) struct ethtool_eeprom *eeprom, u8 * bytes)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
struct cmd_ds_802_11_eeprom_access cmd; struct cmd_ds_802_11_eeprom_access cmd;
int ret; int ret;
...@@ -76,7 +76,7 @@ static int lbs_ethtool_get_eeprom(struct net_device *dev, ...@@ -76,7 +76,7 @@ static int lbs_ethtool_get_eeprom(struct net_device *dev,
static void lbs_ethtool_get_stats(struct net_device *dev, static void lbs_ethtool_get_stats(struct net_device *dev,
struct ethtool_stats *stats, uint64_t *data) struct ethtool_stats *stats, uint64_t *data)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
int ret; int ret;
...@@ -113,7 +113,7 @@ static void lbs_ethtool_get_stats(struct net_device *dev, ...@@ -113,7 +113,7 @@ static void lbs_ethtool_get_stats(struct net_device *dev,
static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset) static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
if (sset == ETH_SS_STATS && dev == priv->mesh_dev) if (sset == ETH_SS_STATS && dev == priv->mesh_dev)
return MESH_STATS_NUM; return MESH_STATS_NUM;
...@@ -143,7 +143,7 @@ static void lbs_ethtool_get_strings(struct net_device *dev, ...@@ -143,7 +143,7 @@ static void lbs_ethtool_get_strings(struct net_device *dev,
static void lbs_ethtool_get_wol(struct net_device *dev, static void lbs_ethtool_get_wol(struct net_device *dev,
struct ethtool_wolinfo *wol) struct ethtool_wolinfo *wol)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
if (priv->wol_criteria == 0xffffffff) { if (priv->wol_criteria == 0xffffffff) {
/* Interface driver didn't configure wake */ /* Interface driver didn't configure wake */
...@@ -166,7 +166,7 @@ static void lbs_ethtool_get_wol(struct net_device *dev, ...@@ -166,7 +166,7 @@ static void lbs_ethtool_get_wol(struct net_device *dev,
static int lbs_ethtool_set_wol(struct net_device *dev, static int lbs_ethtool_set_wol(struct net_device *dev,
struct ethtool_wolinfo *wol) struct ethtool_wolinfo *wol)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
uint32_t criteria = 0; uint32_t criteria = 0;
if (priv->wol_criteria == 0xffffffff && wol->wolopts) if (priv->wol_criteria == 0xffffffff && wol->wolopts)
......
...@@ -59,7 +59,7 @@ static int if_usb_reset_device(struct if_usb_card *cardp); ...@@ -59,7 +59,7 @@ static int if_usb_reset_device(struct if_usb_card *cardp);
static ssize_t if_usb_firmware_set(struct device *dev, static ssize_t if_usb_firmware_set(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct if_usb_card *cardp = priv->card; struct if_usb_card *cardp = priv->card;
char fwname[FIRMWARE_NAME_MAX]; char fwname[FIRMWARE_NAME_MAX];
int ret; int ret;
...@@ -86,7 +86,7 @@ static DEVICE_ATTR(lbs_flash_fw, 0200, NULL, if_usb_firmware_set); ...@@ -86,7 +86,7 @@ static DEVICE_ATTR(lbs_flash_fw, 0200, NULL, if_usb_firmware_set);
static ssize_t if_usb_boot2_set(struct device *dev, static ssize_t if_usb_boot2_set(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct if_usb_card *cardp = priv->card; struct if_usb_card *cardp = priv->card;
char fwname[FIRMWARE_NAME_MAX]; char fwname[FIRMWARE_NAME_MAX];
int ret; int ret;
......
...@@ -222,7 +222,7 @@ u8 lbs_data_rate_to_fw_index(u32 rate) ...@@ -222,7 +222,7 @@ u8 lbs_data_rate_to_fw_index(u32 rate)
static ssize_t lbs_anycast_get(struct device *dev, static ssize_t lbs_anycast_get(struct device *dev,
struct device_attribute *attr, char * buf) struct device_attribute *attr, char * buf)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
int ret; int ret;
...@@ -241,7 +241,7 @@ static ssize_t lbs_anycast_get(struct device *dev, ...@@ -241,7 +241,7 @@ static ssize_t lbs_anycast_get(struct device *dev,
static ssize_t lbs_anycast_set(struct device *dev, static ssize_t lbs_anycast_set(struct device *dev,
struct device_attribute *attr, const char * buf, size_t count) struct device_attribute *attr, const char * buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
uint32_t datum; uint32_t datum;
int ret; int ret;
...@@ -263,7 +263,7 @@ static ssize_t lbs_anycast_set(struct device *dev, ...@@ -263,7 +263,7 @@ static ssize_t lbs_anycast_set(struct device *dev,
static ssize_t lbs_prb_rsp_limit_get(struct device *dev, static ssize_t lbs_prb_rsp_limit_get(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
int ret; int ret;
u32 retry_limit; u32 retry_limit;
...@@ -286,7 +286,7 @@ static ssize_t lbs_prb_rsp_limit_get(struct device *dev, ...@@ -286,7 +286,7 @@ static ssize_t lbs_prb_rsp_limit_get(struct device *dev,
static ssize_t lbs_prb_rsp_limit_set(struct device *dev, static ssize_t lbs_prb_rsp_limit_set(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
int ret; int ret;
unsigned long retry_limit; unsigned long retry_limit;
...@@ -321,7 +321,7 @@ static void lbs_remove_mesh(struct lbs_private *priv); ...@@ -321,7 +321,7 @@ static void lbs_remove_mesh(struct lbs_private *priv);
static ssize_t lbs_rtap_get(struct device *dev, static ssize_t lbs_rtap_get(struct device *dev,
struct device_attribute *attr, char * buf) struct device_attribute *attr, char * buf)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
return snprintf(buf, 5, "0x%X\n", priv->monitormode); return snprintf(buf, 5, "0x%X\n", priv->monitormode);
} }
...@@ -332,7 +332,7 @@ static ssize_t lbs_rtap_set(struct device *dev, ...@@ -332,7 +332,7 @@ static ssize_t lbs_rtap_set(struct device *dev,
struct device_attribute *attr, const char * buf, size_t count) struct device_attribute *attr, const char * buf, size_t count)
{ {
int monitor_mode; int monitor_mode;
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
sscanf(buf, "%x", &monitor_mode); sscanf(buf, "%x", &monitor_mode);
if (monitor_mode) { if (monitor_mode) {
...@@ -383,7 +383,7 @@ static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get, lbs_rtap_set ); ...@@ -383,7 +383,7 @@ static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get, lbs_rtap_set );
static ssize_t lbs_mesh_get(struct device *dev, static ssize_t lbs_mesh_get(struct device *dev,
struct device_attribute *attr, char * buf) struct device_attribute *attr, char * buf)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev); return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev);
} }
...@@ -393,7 +393,7 @@ static ssize_t lbs_mesh_get(struct device *dev, ...@@ -393,7 +393,7 @@ static ssize_t lbs_mesh_get(struct device *dev,
static ssize_t lbs_mesh_set(struct device *dev, static ssize_t lbs_mesh_set(struct device *dev,
struct device_attribute *attr, const char * buf, size_t count) struct device_attribute *attr, const char * buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
int enable; int enable;
int ret, action = CMD_ACT_MESH_CONFIG_STOP; int ret, action = CMD_ACT_MESH_CONFIG_STOP;
...@@ -452,7 +452,7 @@ static struct attribute_group lbs_mesh_attr_group = { ...@@ -452,7 +452,7 @@ static struct attribute_group lbs_mesh_attr_group = {
*/ */
static int lbs_dev_open(struct net_device *dev) static int lbs_dev_open(struct net_device *dev)
{ {
struct lbs_private *priv = netdev_priv(dev) ; struct lbs_private *priv = dev->ml_priv;
int ret = 0; int ret = 0;
lbs_deb_enter(LBS_DEB_NET); lbs_deb_enter(LBS_DEB_NET);
...@@ -521,7 +521,7 @@ static int lbs_mesh_stop(struct net_device *dev) ...@@ -521,7 +521,7 @@ static int lbs_mesh_stop(struct net_device *dev)
*/ */
static int lbs_eth_stop(struct net_device *dev) static int lbs_eth_stop(struct net_device *dev)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
lbs_deb_enter(LBS_DEB_NET); lbs_deb_enter(LBS_DEB_NET);
...@@ -538,7 +538,7 @@ static int lbs_eth_stop(struct net_device *dev) ...@@ -538,7 +538,7 @@ static int lbs_eth_stop(struct net_device *dev)
static void lbs_tx_timeout(struct net_device *dev) static void lbs_tx_timeout(struct net_device *dev)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
lbs_deb_enter(LBS_DEB_TX); lbs_deb_enter(LBS_DEB_TX);
...@@ -590,7 +590,7 @@ EXPORT_SYMBOL_GPL(lbs_host_to_card_done); ...@@ -590,7 +590,7 @@ EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
*/ */
static struct net_device_stats *lbs_get_stats(struct net_device *dev) static struct net_device_stats *lbs_get_stats(struct net_device *dev)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
lbs_deb_enter(LBS_DEB_NET); lbs_deb_enter(LBS_DEB_NET);
return &priv->stats; return &priv->stats;
...@@ -599,7 +599,7 @@ static struct net_device_stats *lbs_get_stats(struct net_device *dev) ...@@ -599,7 +599,7 @@ static struct net_device_stats *lbs_get_stats(struct net_device *dev)
static int lbs_set_mac_address(struct net_device *dev, void *addr) static int lbs_set_mac_address(struct net_device *dev, void *addr)
{ {
int ret = 0; int ret = 0;
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
struct sockaddr *phwaddr = addr; struct sockaddr *phwaddr = addr;
struct cmd_ds_802_11_mac_address cmd; struct cmd_ds_802_11_mac_address cmd;
...@@ -732,7 +732,7 @@ static void lbs_set_mcast_worker(struct work_struct *work) ...@@ -732,7 +732,7 @@ static void lbs_set_mcast_worker(struct work_struct *work)
static void lbs_set_multicast_list(struct net_device *dev) static void lbs_set_multicast_list(struct net_device *dev)
{ {
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
schedule_work(&priv->mcast_work); schedule_work(&priv->mcast_work);
} }
...@@ -748,7 +748,7 @@ static void lbs_set_multicast_list(struct net_device *dev) ...@@ -748,7 +748,7 @@ static void lbs_set_multicast_list(struct net_device *dev)
static int lbs_thread(void *data) static int lbs_thread(void *data)
{ {
struct net_device *dev = data; struct net_device *dev = data;
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
wait_queue_t wait; wait_queue_t wait;
lbs_deb_enter(LBS_DEB_THREAD); lbs_deb_enter(LBS_DEB_THREAD);
...@@ -1184,6 +1184,7 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev) ...@@ -1184,6 +1184,7 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
goto done; goto done;
} }
priv = netdev_priv(dev); priv = netdev_priv(dev);
dev->ml_priv = priv;
if (lbs_init_adapter(priv)) { if (lbs_init_adapter(priv)) {
lbs_pr_err("failed to initialize adapter structure.\n"); lbs_pr_err("failed to initialize adapter structure.\n");
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
static int mesh_get_default_parameters(struct device *dev, static int mesh_get_default_parameters(struct device *dev,
struct mrvl_mesh_defaults *defs) struct mrvl_mesh_defaults *defs)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
int ret; int ret;
...@@ -57,7 +57,7 @@ static ssize_t bootflag_get(struct device *dev, ...@@ -57,7 +57,7 @@ static ssize_t bootflag_get(struct device *dev,
static ssize_t bootflag_set(struct device *dev, struct device_attribute *attr, static ssize_t bootflag_set(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
uint32_t datum; uint32_t datum;
int ret; int ret;
...@@ -100,7 +100,7 @@ static ssize_t boottime_get(struct device *dev, ...@@ -100,7 +100,7 @@ static ssize_t boottime_get(struct device *dev,
static ssize_t boottime_set(struct device *dev, static ssize_t boottime_set(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
uint32_t datum; uint32_t datum;
int ret; int ret;
...@@ -152,7 +152,7 @@ static ssize_t channel_get(struct device *dev, ...@@ -152,7 +152,7 @@ static ssize_t channel_get(struct device *dev,
static ssize_t channel_set(struct device *dev, struct device_attribute *attr, static ssize_t channel_set(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
uint32_t datum; uint32_t datum;
int ret; int ret;
...@@ -210,7 +210,7 @@ static ssize_t mesh_id_set(struct device *dev, struct device_attribute *attr, ...@@ -210,7 +210,7 @@ static ssize_t mesh_id_set(struct device *dev, struct device_attribute *attr,
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
struct mrvl_mesh_defaults defs; struct mrvl_mesh_defaults defs;
struct mrvl_meshie *ie; struct mrvl_meshie *ie;
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
int len; int len;
int ret; int ret;
...@@ -269,7 +269,7 @@ static ssize_t protocol_id_set(struct device *dev, ...@@ -269,7 +269,7 @@ static ssize_t protocol_id_set(struct device *dev,
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
struct mrvl_mesh_defaults defs; struct mrvl_mesh_defaults defs;
struct mrvl_meshie *ie; struct mrvl_meshie *ie;
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
uint32_t datum; uint32_t datum;
int ret; int ret;
...@@ -323,7 +323,7 @@ static ssize_t metric_id_set(struct device *dev, struct device_attribute *attr, ...@@ -323,7 +323,7 @@ static ssize_t metric_id_set(struct device *dev, struct device_attribute *attr,
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
struct mrvl_mesh_defaults defs; struct mrvl_mesh_defaults defs;
struct mrvl_meshie *ie; struct mrvl_meshie *ie;
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
uint32_t datum; uint32_t datum;
int ret; int ret;
...@@ -377,7 +377,7 @@ static ssize_t capability_set(struct device *dev, struct device_attribute *attr, ...@@ -377,7 +377,7 @@ static ssize_t capability_set(struct device *dev, struct device_attribute *attr,
struct cmd_ds_mesh_config cmd; struct cmd_ds_mesh_config cmd;
struct mrvl_mesh_defaults defs; struct mrvl_mesh_defaults defs;
struct mrvl_meshie *ie; struct mrvl_meshie *ie;
struct lbs_private *priv = netdev_priv(to_net_dev(dev)); struct lbs_private *priv = to_net_dev(dev)->ml_priv;
uint32_t datum; uint32_t datum;
int ret; int ret;
......
...@@ -945,7 +945,7 @@ int lbs_set_scan(struct net_device *dev, struct iw_request_info *info, ...@@ -945,7 +945,7 @@ int lbs_set_scan(struct net_device *dev, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra) union iwreq_data *wrqu, char *extra)
{ {
DECLARE_SSID_BUF(ssid); DECLARE_SSID_BUF(ssid);
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
int ret = 0; int ret = 0;
lbs_deb_enter(LBS_DEB_WEXT); lbs_deb_enter(LBS_DEB_WEXT);
...@@ -1008,7 +1008,7 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info, ...@@ -1008,7 +1008,7 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, char *extra) struct iw_point *dwrq, char *extra)
{ {
#define SCAN_ITEM_SIZE 128 #define SCAN_ITEM_SIZE 128
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
int err = 0; int err = 0;
char *ev = extra; char *ev = extra;
char *stop = ev + dwrq->length; char *stop = ev + dwrq->length;
......
...@@ -60,7 +60,7 @@ static u32 convert_radiotap_rate_to_mv(u8 rate) ...@@ -60,7 +60,7 @@ static u32 convert_radiotap_rate_to_mv(u8 rate)
int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
unsigned long flags; unsigned long flags;
struct lbs_private *priv = netdev_priv(dev); struct lbs_private *priv = dev->ml_priv;
struct txpd *txpd; struct txpd *txpd;
char *p802x_hdr; char *p802x_hdr;
uint16_t pkt_len; uint16_t pkt_len;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment