* [PATCH] Implement ethtool set_phys_id callback to ease locating specific physical devices.
@ 2016-06-10 20:39 Maximilian Schneider
2016-06-17 9:46 ` Marc Kleine-Budde
0 siblings, 1 reply; 3+ messages in thread
From: Maximilian Schneider @ 2016-06-10 20:39 UTC (permalink / raw)
To: linux-can@vger.kernel.org
From a58480fb1c7bb86c11c0d861f3f2997941a84a65 Mon Sep 17 00:00:00 2001
From: Maximilian Schneider <max@schneidersoft.net>
Date: Fri, 10 Jun 2016 16:50:16 +0000
Subject: [PATCH] Implement ethtool set_phys_id callback to ease locating
specific physical devices.
currently supported on candleLight interfaces.
Signed-off-by: Hubert Denkmair <hubert@denkmair.de>
Signed-off-by: Maximilian Schneider <max@schneidersoft.net>
---
drivers/net/can/usb/gs_usb.c | 140 ++++++++++++++++++++++++++++++-------------
1 file changed, 98 insertions(+), 42 deletions(-)
diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
index acb0c84..b6a9fef 100644
--- a/drivers/net/can/usb/gs_usb.c
+++ b/drivers/net/can/usb/gs_usb.c
@@ -44,7 +44,9 @@ enum gs_usb_breq {
GS_USB_BREQ_MODE,
GS_USB_BREQ_BERR,
GS_USB_BREQ_BT_CONST,
- GS_USB_BREQ_DEVICE_CONFIG
+ GS_USB_BREQ_DEVICE_CONFIG,
+ GS_USB_BREQ_TIMESTAMP,
+ GS_USB_BREQ_IDENTIFY
};
enum gs_can_mode {
@@ -63,6 +65,11 @@ enum gs_can_state {
GS_CAN_STATE_SLEEPING
};
+enum gs_can_identify_mode {
+ GS_CAN_IDENTIFY_OFF = 0,
+ GS_CAN_IDENTIFY_ON
+};
+
/* data types passed between host and device */
struct gs_host_config {
u32 byte_order;
@@ -82,10 +89,10 @@ struct gs_device_config {
} __packed;
#define GS_CAN_MODE_NORMAL 0
-#define GS_CAN_MODE_LISTEN_ONLY (1<<0)
-#define GS_CAN_MODE_LOOP_BACK (1<<1)
-#define GS_CAN_MODE_TRIPLE_SAMPLE (1<<2)
-#define GS_CAN_MODE_ONE_SHOT (1<<3)
+#define GS_CAN_MODE_LISTEN_ONLY BIT(0)
+#define GS_CAN_MODE_LOOP_BACK BIT(1)
+#define GS_CAN_MODE_TRIPLE_SAMPLE BIT(2)
+#define GS_CAN_MODE_ONE_SHOT BIT(3)
struct gs_device_mode {
u32 mode;
@@ -106,10 +113,16 @@ struct gs_device_bittiming {
u32 brp;
} __packed;
-#define GS_CAN_FEATURE_LISTEN_ONLY (1<<0)
-#define GS_CAN_FEATURE_LOOP_BACK (1<<1)
-#define GS_CAN_FEATURE_TRIPLE_SAMPLE (1<<2)
-#define GS_CAN_FEATURE_ONE_SHOT (1<<3)
+struct gs_identify_mode {
+ u32 mode;
+} __packed;
+
+#define GS_CAN_FEATURE_LISTEN_ONLY BIT(0)
+#define GS_CAN_FEATURE_LOOP_BACK BIT(1)
+#define GS_CAN_FEATURE_TRIPLE_SAMPLE BIT(2)
+#define GS_CAN_FEATURE_ONE_SHOT BIT(3)
+#define GS_CAN_FEATURE_HW_TIMESTAMP BIT(4)
+#define GS_CAN_FEATURE_IDENTIFY BIT(5)
struct gs_device_bt_const {
u32 feature;
@@ -214,7 +227,8 @@ static void gs_free_tx_context(struct gs_tx_context *txc)
/* Get a tx context by id.
*/
-static struct gs_tx_context *gs_get_tx_context(struct gs_can *dev, unsigned int id)
+static struct gs_tx_context *gs_get_tx_context(struct gs_can *dev,
+ unsigned int id)
{
unsigned long flags;
@@ -457,7 +471,8 @@ static void gs_usb_xmit_callback(struct urb *urb)
netif_wake_queue(netdev);
}
-static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, struct net_device *netdev)
+static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
+ struct net_device *netdev)
{
struct gs_can *dev = netdev_priv(netdev);
struct net_device_stats *stats = &dev->netdev->stats;
@@ -661,9 +676,12 @@ static int gs_can_open(struct net_device *netdev)
/* finally start device */
dm->mode = GS_CAN_MODE_START;
rc = usb_control_msg(interface_to_usbdev(dev->iface),
- usb_sndctrlpipe(interface_to_usbdev(dev->iface), 0),
+ usb_sndctrlpipe(interface_to_usbdev(dev->iface),
+ 0),
GS_USB_BREQ_MODE,
- USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
+ USB_DIR_OUT |
+ USB_TYPE_VENDOR |
+ USB_RECIP_INTERFACE,
dev->channel,
0,
dm,
@@ -726,7 +744,56 @@ static const struct net_device_ops gs_usb_netdev_ops = {
.ndo_change_mtu = can_change_mtu,
};
-static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf)
+static int gs_usb_set_identify(struct net_device *netdev, bool do_identify)
+{
+ int rc;
+ struct gs_identify_mode imode;
+ struct gs_can *dev = netdev_priv(netdev);
+
+ imode.mode = do_identify ? GS_CAN_IDENTIFY_ON : GS_CAN_IDENTIFY_OFF;
+ rc = usb_control_msg(interface_to_usbdev(dev->iface),
+ usb_sndctrlpipe(interface_to_usbdev(dev->iface),
+ 0),
+ GS_USB_BREQ_IDENTIFY,
+ USB_DIR_OUT |
+ USB_TYPE_VENDOR |
+ USB_RECIP_INTERFACE,
+ dev->channel,
+ 0,
+ &imode,
+ sizeof(imode),
+ 100);
+
+ return (rc > 0) ? 0 : -1;
+}
+
+/* blink LED's for finding the this interface */
+static int gs_usb_set_phys_id(struct net_device *dev,
+ enum ethtool_phys_id_state state)
+{
+ int rv = 0;
+
+ switch (state) {
+ case ETHTOOL_ID_ACTIVE:
+ rv = gs_usb_set_identify(dev, GS_CAN_IDENTIFY_ON);
+ break;
+ case ETHTOOL_ID_INACTIVE:
+ rv = gs_usb_set_identify(dev, GS_CAN_IDENTIFY_OFF);
+ break;
+ default:
+ break;
+ }
+
+ return rv;
+}
+
+static const struct ethtool_ops gs_usb_ethtool_ops = {
+ .set_phys_id = gs_usb_set_phys_id,
+};
+
+static struct gs_can *gs_make_candev(unsigned int channel,
+ struct usb_interface *intf,
+ struct gs_device_config *dconf)
{
struct gs_can *dev;
struct net_device *netdev;
@@ -814,10 +881,14 @@ static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface
if (bt_const->feature & GS_CAN_FEATURE_ONE_SHOT)
dev->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT;
- kfree(bt_const);
-
SET_NETDEV_DEV(netdev, &intf->dev);
+ if (dconf->sw_version > 1)
+ if (bt_const->feature & GS_CAN_FEATURE_IDENTIFY)
+ netdev->ethtool_ops = &gs_usb_ethtool_ops;
+
+ kfree(bt_const);
+
rc = register_candev(dev->netdev);
if (rc) {
free_candev(dev->netdev);
@@ -835,19 +906,16 @@ static void gs_destroy_candev(struct gs_can *dev)
free_candev(dev->netdev);
}
-static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
+static int gs_usb_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
{
struct gs_usb *dev;
int rc = -ENOMEM;
unsigned int icount, i;
- struct gs_host_config *hconf;
- struct gs_device_config *dconf;
-
- hconf = kmalloc(sizeof(*hconf), GFP_KERNEL);
- if (!hconf)
- return -ENOMEM;
+ struct gs_host_config hconf;
+ struct gs_device_config dconf;
- hconf->byte_order = 0x0000beef;
+ hconf.byte_order = 0x0000beef;
/* send host config */
rc = usb_control_msg(interface_to_usbdev(intf),
@@ -856,22 +924,16 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
1,
intf->altsetting[0].desc.bInterfaceNumber,
- hconf,
- sizeof(*hconf),
+ &hconf,
+ sizeof(hconf),
1000);
- kfree(hconf);
-
if (rc < 0) {
dev_err(&intf->dev, "Couldn't send data format (err=%d)\n",
rc);
return rc;
}
- dconf = kmalloc(sizeof(*dconf), GFP_KERNEL);
- if (!dconf)
- return -ENOMEM;
-
/* read device config */
rc = usb_control_msg(interface_to_usbdev(intf),
usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
@@ -879,22 +941,16 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
1,
intf->altsetting[0].desc.bInterfaceNumber,
- dconf,
- sizeof(*dconf),
+ &dconf,
+ sizeof(dconf),
1000);
if (rc < 0) {
dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n",
rc);
-
- kfree(dconf);
-
return rc;
}
- icount = dconf->icount+1;
-
- kfree(dconf);
-
+ icount = dconf.icount + 1;
dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
if (icount > GS_MAX_INTF) {
@@ -915,7 +971,7 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
dev->udev = interface_to_usbdev(intf);
for (i = 0; i < icount; i++) {
- dev->canch[i] = gs_make_candev(i, intf);
+ dev->canch[i] = gs_make_candev(i, intf, &dconf);
if (IS_ERR_OR_NULL(dev->canch[i])) {
/* save error code to return later */
rc = PTR_ERR(dev->canch[i]);
--
2.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Implement ethtool set_phys_id callback to ease locating specific physical devices.
2016-06-10 20:39 [PATCH] Implement ethtool set_phys_id callback to ease locating specific physical devices Maximilian Schneider
@ 2016-06-17 9:46 ` Marc Kleine-Budde
2016-06-17 9:55 ` Marc Kleine-Budde
0 siblings, 1 reply; 3+ messages in thread
From: Marc Kleine-Budde @ 2016-06-17 9:46 UTC (permalink / raw)
To: Maximilian Schneider, linux-can@vger.kernel.org
[-- Attachment #1.1: Type: text/plain, Size: 9531 bytes --]
On 06/10/2016 10:39 PM, Maximilian Schneider wrote:
> From a58480fb1c7bb86c11c0d861f3f2997941a84a65 Mon Sep 17 00:00:00 2001
> From: Maximilian Schneider <max@schneidersoft.net>
> Date: Fri, 10 Jun 2016 16:50:16 +0000
> Subject: [PATCH] Implement ethtool set_phys_id callback to ease locating
> specific physical devices.
>
> currently supported on candleLight interfaces.
Does the LED blink automatically or do you switch it on and off via a
USB msg?
Please move the coding style enhancements into a separate patch.
>
> Signed-off-by: Hubert Denkmair <hubert@denkmair.de>
> Signed-off-by: Maximilian Schneider <max@schneidersoft.net>
> ---
> drivers/net/can/usb/gs_usb.c | 140 ++++++++++++++++++++++++++++++-------------
> 1 file changed, 98 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
> index acb0c84..b6a9fef 100644
> --- a/drivers/net/can/usb/gs_usb.c
> +++ b/drivers/net/can/usb/gs_usb.c
> @@ -44,7 +44,9 @@ enum gs_usb_breq {
> GS_USB_BREQ_MODE,
> GS_USB_BREQ_BERR,
> GS_USB_BREQ_BT_CONST,
> - GS_USB_BREQ_DEVICE_CONFIG
> + GS_USB_BREQ_DEVICE_CONFIG,
> + GS_USB_BREQ_TIMESTAMP,
> + GS_USB_BREQ_IDENTIFY
> };
>
> enum gs_can_mode {
> @@ -63,6 +65,11 @@ enum gs_can_state {
> GS_CAN_STATE_SLEEPING
> };
>
> +enum gs_can_identify_mode {
> + GS_CAN_IDENTIFY_OFF = 0,
> + GS_CAN_IDENTIFY_ON
> +};
> +
> /* data types passed between host and device */
> struct gs_host_config {
> u32 byte_order;
> @@ -82,10 +89,10 @@ struct gs_device_config {
> } __packed;
>
> #define GS_CAN_MODE_NORMAL 0
> -#define GS_CAN_MODE_LISTEN_ONLY (1<<0)
> -#define GS_CAN_MODE_LOOP_BACK (1<<1)
> -#define GS_CAN_MODE_TRIPLE_SAMPLE (1<<2)
> -#define GS_CAN_MODE_ONE_SHOT (1<<3)
> +#define GS_CAN_MODE_LISTEN_ONLY BIT(0)
> +#define GS_CAN_MODE_LOOP_BACK BIT(1)
> +#define GS_CAN_MODE_TRIPLE_SAMPLE BIT(2)
> +#define GS_CAN_MODE_ONE_SHOT BIT(3)
>
> struct gs_device_mode {
> u32 mode;
> @@ -106,10 +113,16 @@ struct gs_device_bittiming {
> u32 brp;
> } __packed;
>
> -#define GS_CAN_FEATURE_LISTEN_ONLY (1<<0)
> -#define GS_CAN_FEATURE_LOOP_BACK (1<<1)
> -#define GS_CAN_FEATURE_TRIPLE_SAMPLE (1<<2)
> -#define GS_CAN_FEATURE_ONE_SHOT (1<<3)
> +struct gs_identify_mode {
> + u32 mode;
> +} __packed;
> +
> +#define GS_CAN_FEATURE_LISTEN_ONLY BIT(0)
> +#define GS_CAN_FEATURE_LOOP_BACK BIT(1)
> +#define GS_CAN_FEATURE_TRIPLE_SAMPLE BIT(2)
> +#define GS_CAN_FEATURE_ONE_SHOT BIT(3)
> +#define GS_CAN_FEATURE_HW_TIMESTAMP BIT(4)
> +#define GS_CAN_FEATURE_IDENTIFY BIT(5)
>
> struct gs_device_bt_const {
> u32 feature;
> @@ -214,7 +227,8 @@ static void gs_free_tx_context(struct gs_tx_context *txc)
>
> /* Get a tx context by id.
> */
> -static struct gs_tx_context *gs_get_tx_context(struct gs_can *dev, unsigned int id)
> +static struct gs_tx_context *gs_get_tx_context(struct gs_can *dev,
> + unsigned int id)
> {
> unsigned long flags;
>
> @@ -457,7 +471,8 @@ static void gs_usb_xmit_callback(struct urb *urb)
> netif_wake_queue(netdev);
> }
>
> -static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, struct net_device *netdev)
> +static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
> + struct net_device *netdev)
> {
> struct gs_can *dev = netdev_priv(netdev);
> struct net_device_stats *stats = &dev->netdev->stats;
> @@ -661,9 +676,12 @@ static int gs_can_open(struct net_device *netdev)
> /* finally start device */
> dm->mode = GS_CAN_MODE_START;
> rc = usb_control_msg(interface_to_usbdev(dev->iface),
> - usb_sndctrlpipe(interface_to_usbdev(dev->iface), 0),
> + usb_sndctrlpipe(interface_to_usbdev(dev->iface),
> + 0),
> GS_USB_BREQ_MODE,
> - USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
> + USB_DIR_OUT |
> + USB_TYPE_VENDOR |
> + USB_RECIP_INTERFACE,
> dev->channel,
> 0,
> dm,
> @@ -726,7 +744,56 @@ static const struct net_device_ops gs_usb_netdev_ops = {
> .ndo_change_mtu = can_change_mtu,
> };
>
> -static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf)
> +static int gs_usb_set_identify(struct net_device *netdev, bool do_identify)
> +{
> + int rc;
> + struct gs_identify_mode imode;
> + struct gs_can *dev = netdev_priv(netdev);
> +
> + imode.mode = do_identify ? GS_CAN_IDENTIFY_ON : GS_CAN_IDENTIFY_OFF;
> + rc = usb_control_msg(interface_to_usbdev(dev->iface),
> + usb_sndctrlpipe(interface_to_usbdev(dev->iface),
> + 0),
> + GS_USB_BREQ_IDENTIFY,
> + USB_DIR_OUT |
> + USB_TYPE_VENDOR |
> + USB_RECIP_INTERFACE,
> + dev->channel,
> + 0,
> + &imode,
> + sizeof(imode),
> + 100);
> +
> + return (rc > 0) ? 0 : -1;
please return a proper error value here. What about:
return (rc > 0) ? 0 : rc;
> +}
> +
> +/* blink LED's for finding the this interface */
> +static int gs_usb_set_phys_id(struct net_device *dev,
> + enum ethtool_phys_id_state state)
> +{
> + int rv = 0;
nitpick please use "int rc" as the rest of the driver does.
> +
> + switch (state) {
> + case ETHTOOL_ID_ACTIVE:
> + rv = gs_usb_set_identify(dev, GS_CAN_IDENTIFY_ON);
> + break;
> + case ETHTOOL_ID_INACTIVE:
> + rv = gs_usb_set_identify(dev, GS_CAN_IDENTIFY_OFF);
> + break;
> + default:
> + break;
> + }
> +
> + return rv;
> +}
> +
> +static const struct ethtool_ops gs_usb_ethtool_ops = {
> + .set_phys_id = gs_usb_set_phys_id,
> +};
> +
> +static struct gs_can *gs_make_candev(unsigned int channel,
> + struct usb_interface *intf,
> + struct gs_device_config *dconf)
> {
> struct gs_can *dev;
> struct net_device *netdev;
> @@ -814,10 +881,14 @@ static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface
> if (bt_const->feature & GS_CAN_FEATURE_ONE_SHOT)
> dev->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT;
>
> - kfree(bt_const);
> -
> SET_NETDEV_DEV(netdev, &intf->dev);
>
> + if (dconf->sw_version > 1)
> + if (bt_const->feature & GS_CAN_FEATURE_IDENTIFY)
> + netdev->ethtool_ops = &gs_usb_ethtool_ops;
> +
> + kfree(bt_const);
> +
> rc = register_candev(dev->netdev);
> if (rc) {
> free_candev(dev->netdev);
> @@ -835,19 +906,16 @@ static void gs_destroy_candev(struct gs_can *dev)
> free_candev(dev->netdev);
> }
>
> -static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
> +static int gs_usb_probe(struct usb_interface *intf,
> + const struct usb_device_id *id)
> {
> struct gs_usb *dev;
> int rc = -ENOMEM;
> unsigned int icount, i;
> - struct gs_host_config *hconf;
> - struct gs_device_config *dconf;
> -
> - hconf = kmalloc(sizeof(*hconf), GFP_KERNEL);
> - if (!hconf)
> - return -ENOMEM;
> + struct gs_host_config hconf;
> + struct gs_device_config dconf;
>
> - hconf->byte_order = 0x0000beef;
> + hconf.byte_order = 0x0000beef;
>
> /* send host config */
> rc = usb_control_msg(interface_to_usbdev(intf),
> @@ -856,22 +924,16 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
> USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
> 1,
> intf->altsetting[0].desc.bInterfaceNumber,
> - hconf,
> - sizeof(*hconf),
> + &hconf,
> + sizeof(hconf),
> 1000);
>
> - kfree(hconf);
> -
> if (rc < 0) {
> dev_err(&intf->dev, "Couldn't send data format (err=%d)\n",
> rc);
> return rc;
> }
>
> - dconf = kmalloc(sizeof(*dconf), GFP_KERNEL);
> - if (!dconf)
> - return -ENOMEM;
> -
> /* read device config */
> rc = usb_control_msg(interface_to_usbdev(intf),
> usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
> @@ -879,22 +941,16 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
> USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
> 1,
> intf->altsetting[0].desc.bInterfaceNumber,
> - dconf,
> - sizeof(*dconf),
> + &dconf,
> + sizeof(dconf),
> 1000);
> if (rc < 0) {
> dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n",
> rc);
> -
> - kfree(dconf);
> -
> return rc;
> }
>
> - icount = dconf->icount+1;
> -
> - kfree(dconf);
> -
> + icount = dconf.icount + 1;
> dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
>
> if (icount > GS_MAX_INTF) {
> @@ -915,7 +971,7 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
> dev->udev = interface_to_usbdev(intf);
>
> for (i = 0; i < icount; i++) {
> - dev->canch[i] = gs_make_candev(i, intf);
> + dev->canch[i] = gs_make_candev(i, intf, &dconf);
> if (IS_ERR_OR_NULL(dev->canch[i])) {
> /* save error code to return later */
> rc = PTR_ERR(dev->canch[i]);
>
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Implement ethtool set_phys_id callback to ease locating specific physical devices.
2016-06-17 9:46 ` Marc Kleine-Budde
@ 2016-06-17 9:55 ` Marc Kleine-Budde
0 siblings, 0 replies; 3+ messages in thread
From: Marc Kleine-Budde @ 2016-06-17 9:55 UTC (permalink / raw)
To: Maximilian Schneider, linux-can@vger.kernel.org
[-- Attachment #1.1: Type: text/plain, Size: 1095 bytes --]
On 06/17/2016 11:46 AM, Marc Kleine-Budde wrote:
> On 06/10/2016 10:39 PM, Maximilian Schneider wrote:
>> From a58480fb1c7bb86c11c0d861f3f2997941a84a65 Mon Sep 17 00:00:00 2001
>> From: Maximilian Schneider <max@schneidersoft.net>
>> Date: Fri, 10 Jun 2016 16:50:16 +0000
>> Subject: [PATCH] Implement ethtool set_phys_id callback to ease locating
>> specific physical devices.
>>
>> currently supported on candleLight interfaces.
>
> Does the LED blink automatically or do you switch it on and off via a
> USB msg?
>
> Please move the coding style enhancements into a separate patch.
>
>>
>> Signed-off-by: Hubert Denkmair <hubert@denkmair.de>
>> Signed-off-by: Maximilian Schneider <max@schneidersoft.net>
BTW: Who's the Author of the patch? Hubert Denkmair or Maximilian Schneider?
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-06-17 9:55 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-10 20:39 [PATCH] Implement ethtool set_phys_id callback to ease locating specific physical devices Maximilian Schneider
2016-06-17 9:46 ` Marc Kleine-Budde
2016-06-17 9:55 ` Marc Kleine-Budde
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox