From patchwork Thu May 14 09:52:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548419 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E7F791391 for ; Thu, 14 May 2020 09:53:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B811E20722 for ; Thu, 14 May 2020 09:53:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="wsaGAfQX" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726011AbgENJxE (ORCPT ); Thu, 14 May 2020 05:53:04 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:51736 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725946AbgENJxD (ORCPT ); Thu, 14 May 2020 05:53:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449982; x=1620985982; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=soUDiMtrRfuPAr6rZbWkqacOFwcWvAaZSBQhuT13OGw=; b=wsaGAfQXsGFwkxYdnrlCnu4Dw2gldeiPblpI5JSMr1LMl9Tdb5AuLHYr 76mRpWEbNxMBO5oIfQziQVr75QPGIEJDJn3tDm8a1xHA5jgqjJH/lG4Ex BrpWjhFulXTbPxftnKH2YHFLULTzoMdiQfZVxMC61RRNMYfgpN8A0Mx3B 0QFupGi5Z6QCQWix/g6unHbns7qtEPCO1AzLfmaD99QN7jL99+3gGhUWK crYARmzlMO4BjhC64ZO2k7Q93Pj+BCw2LeZHxM8uk0U0kHYNP1lHI7iUV iUiN5Sz4RX3d6+07Z/B0gTNf4yvZQU6jq1Ekdf8vSvwuoSgtshESTYlDh w==; IronPort-SDR: 3HDrZQnkSdbnSVUgXdgyDp92VRogkwoyQ6T5PzbrLxlVWmTyb7vcrTj2TjPiQ0yNymuLasv6S9 o0IYGhd7m5Dt5XAIkklz/inoJvKgqE9zWTBseZt7fElfV61ZN1pvJdR6roysXIbalyrDT0+wJ/ 7PYYobvXqC2tRMhiCBd4RR1lULDkGAZb816rQKQxSPl336IlAzE50tHR50DvWDt2qD38avidBm 24bsCChX+YifAAItvb+AvDbHOQOjBpKdscEc5CZSQumqZTBapO2BUKq+onKSvxZ+oNzmsz3ivB EVI= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="76630474" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:01 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:01 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:00 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 1/8] drivers: most: add usb adapter driver Date: Thu, 14 May 2020 11:52:49 +0200 Message-ID: <1589449976-11378-2-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch adds the usb driver source file most_usb.c and modifies the Makefile and Kconfig accordingly. Signed-off-by: Christian Gromm --- v2: Reported-by: Greg Kroah-Hartman - don't remove usb driver from staging area - don't touch staging/most/Kconfig - remove subdirectory for USB driver and put source file into drivers/most drivers/most/Kconfig | 12 + drivers/most/Makefile | 2 + drivers/most/most_usb.c | 1262 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1276 insertions(+) create mode 100644 drivers/most/most_usb.c diff --git a/drivers/most/Kconfig b/drivers/most/Kconfig index 58d7999..8650683 100644 --- a/drivers/most/Kconfig +++ b/drivers/most/Kconfig @@ -13,3 +13,15 @@ menuconfig MOST module will be called most_core. If in doubt, say N here. + +if MOST +config MOST_USB + tristate "USB" + depends on USB && NET + help + Say Y here if you want to connect via USB to network tranceiver. + This device driver depends on the networking AIM. + + To compile this driver as a module, choose M here: the + module will be called most_usb. +endif diff --git a/drivers/most/Makefile b/drivers/most/Makefile index e810cd3..97ffc06 100644 --- a/drivers/most/Makefile +++ b/drivers/most/Makefile @@ -2,3 +2,5 @@ obj-$(CONFIG_MOST) += most_core.o most_core-y := core.o \ configfs.o + +obj-$(CONFIG_MOST_USB) += most_usb.o diff --git a/drivers/most/most_usb.c b/drivers/most/most_usb.c new file mode 100644 index 0000000..daa5e4b --- /dev/null +++ b/drivers/most/most_usb.c @@ -0,0 +1,1262 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * usb.c - Hardware dependent module for USB + * + * Copyright (C) 2013-2015 Microchip Technology Germany II GmbH & Co. KG + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define USB_MTU 512 +#define NO_ISOCHRONOUS_URB 0 +#define AV_PACKETS_PER_XACT 2 +#define BUF_CHAIN_SIZE 0xFFFF +#define MAX_NUM_ENDPOINTS 30 +#define MAX_SUFFIX_LEN 10 +#define MAX_STRING_LEN 80 +#define MAX_BUF_SIZE 0xFFFF + +#define USB_VENDOR_ID_SMSC 0x0424 /* VID: SMSC */ +#define USB_DEV_ID_BRDG 0xC001 /* PID: USB Bridge */ +#define USB_DEV_ID_OS81118 0xCF18 /* PID: USB OS81118 */ +#define USB_DEV_ID_OS81119 0xCF19 /* PID: USB OS81119 */ +#define USB_DEV_ID_OS81210 0xCF30 /* PID: USB OS81210 */ +/* DRCI Addresses */ +#define DRCI_REG_NI_STATE 0x0100 +#define DRCI_REG_PACKET_BW 0x0101 +#define DRCI_REG_NODE_ADDR 0x0102 +#define DRCI_REG_NODE_POS 0x0103 +#define DRCI_REG_MEP_FILTER 0x0140 +#define DRCI_REG_HASH_TBL0 0x0141 +#define DRCI_REG_HASH_TBL1 0x0142 +#define DRCI_REG_HASH_TBL2 0x0143 +#define DRCI_REG_HASH_TBL3 0x0144 +#define DRCI_REG_HW_ADDR_HI 0x0145 +#define DRCI_REG_HW_ADDR_MI 0x0146 +#define DRCI_REG_HW_ADDR_LO 0x0147 +#define DRCI_REG_BASE 0x1100 +#define DRCI_COMMAND 0x02 +#define DRCI_READ_REQ 0xA0 +#define DRCI_WRITE_REQ 0xA1 + +/** + * struct most_dci_obj - Direct Communication Interface + * @kobj:position in sysfs + * @usb_device: pointer to the usb device + * @reg_addr: register address for arbitrary DCI access + */ +struct most_dci_obj { + struct device dev; + struct usb_device *usb_device; + u16 reg_addr; +}; + +#define to_dci_obj(p) container_of(p, struct most_dci_obj, dev) + +struct most_dev; + +struct clear_hold_work { + struct work_struct ws; + struct most_dev *mdev; + unsigned int channel; + int pipe; +}; + +#define to_clear_hold_work(w) container_of(w, struct clear_hold_work, ws) + +/** + * struct most_dev - holds all usb interface specific stuff + * @usb_device: pointer to usb device + * @iface: hardware interface + * @cap: channel capabilities + * @conf: channel configuration + * @dci: direct communication interface of hardware + * @ep_address: endpoint address table + * @description: device description + * @suffix: suffix for channel name + * @channel_lock: synchronize channel access + * @padding_active: indicates channel uses padding + * @is_channel_healthy: health status table of each channel + * @busy_urbs: list of anchored items + * @io_mutex: synchronize I/O with disconnect + * @link_stat_timer: timer for link status reports + * @poll_work_obj: work for polling link status + */ +struct most_dev { + struct device dev; + struct usb_device *usb_device; + struct most_interface iface; + struct most_channel_capability *cap; + struct most_channel_config *conf; + struct most_dci_obj *dci; + u8 *ep_address; + char description[MAX_STRING_LEN]; + char suffix[MAX_NUM_ENDPOINTS][MAX_SUFFIX_LEN]; + spinlock_t channel_lock[MAX_NUM_ENDPOINTS]; /* sync channel access */ + bool padding_active[MAX_NUM_ENDPOINTS]; + bool is_channel_healthy[MAX_NUM_ENDPOINTS]; + struct clear_hold_work clear_work[MAX_NUM_ENDPOINTS]; + struct usb_anchor *busy_urbs; + struct mutex io_mutex; + struct timer_list link_stat_timer; + struct work_struct poll_work_obj; + void (*on_netinfo)(struct most_interface *most_iface, + unsigned char link_state, unsigned char *addrs); +}; + +#define to_mdev(d) container_of(d, struct most_dev, iface) +#define to_mdev_from_dev(d) container_of(d, struct most_dev, dev) +#define to_mdev_from_work(w) container_of(w, struct most_dev, poll_work_obj) + +static void wq_clear_halt(struct work_struct *wq_obj); +static void wq_netinfo(struct work_struct *wq_obj); + +/** + * drci_rd_reg - read a DCI register + * @dev: usb device + * @reg: register address + * @buf: buffer to store data + * + * This is reads data from INIC's direct register communication interface + */ +static inline int drci_rd_reg(struct usb_device *dev, u16 reg, u16 *buf) +{ + int retval; + __le16 *dma_buf = kzalloc(sizeof(*dma_buf), GFP_KERNEL); + u8 req_type = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; + + if (!dma_buf) + return -ENOMEM; + + retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), + DRCI_READ_REQ, req_type, + 0x0000, + reg, dma_buf, sizeof(*dma_buf), 5 * HZ); + *buf = le16_to_cpu(*dma_buf); + kfree(dma_buf); + + return retval; +} + +/** + * drci_wr_reg - write a DCI register + * @dev: usb device + * @reg: register address + * @data: data to write + * + * This is writes data to INIC's direct register communication interface + */ +static inline int drci_wr_reg(struct usb_device *dev, u16 reg, u16 data) +{ + return usb_control_msg(dev, + usb_sndctrlpipe(dev, 0), + DRCI_WRITE_REQ, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + data, + reg, + NULL, + 0, + 5 * HZ); +} + +static inline int start_sync_ep(struct usb_device *usb_dev, u16 ep) +{ + return drci_wr_reg(usb_dev, DRCI_REG_BASE + DRCI_COMMAND + ep * 16, 1); +} + +/** + * get_stream_frame_size - calculate frame size of current configuration + * @cfg: channel configuration + */ +static unsigned int get_stream_frame_size(struct most_channel_config *cfg) +{ + unsigned int frame_size = 0; + unsigned int sub_size = cfg->subbuffer_size; + + if (!sub_size) { + pr_warn("Misconfig: Subbuffer size zero.\n"); + return frame_size; + } + switch (cfg->data_type) { + case MOST_CH_ISOC: + frame_size = AV_PACKETS_PER_XACT * sub_size; + break; + case MOST_CH_SYNC: + if (cfg->packets_per_xact == 0) { + pr_warn("Misconfig: Packets per XACT zero\n"); + frame_size = 0; + } else if (cfg->packets_per_xact == 0xFF) { + frame_size = (USB_MTU / sub_size) * sub_size; + } else { + frame_size = cfg->packets_per_xact * sub_size; + } + break; + default: + pr_warn("Query frame size of non-streaming channel\n"); + break; + } + return frame_size; +} + +/** + * hdm_poison_channel - mark buffers of this channel as invalid + * @iface: pointer to the interface + * @channel: channel ID + * + * This unlinks all URBs submitted to the HCD, + * calls the associated completion function of the core and removes + * them from the list. + * + * Returns 0 on success or error code otherwise. + */ +static int hdm_poison_channel(struct most_interface *iface, int channel) +{ + struct most_dev *mdev = to_mdev(iface); + unsigned long flags; + spinlock_t *lock; /* temp. lock */ + + if (channel < 0 || channel >= iface->num_channels) { + dev_warn(&mdev->usb_device->dev, "Channel ID out of range.\n"); + return -ECHRNG; + } + + lock = mdev->channel_lock + channel; + spin_lock_irqsave(lock, flags); + mdev->is_channel_healthy[channel] = false; + spin_unlock_irqrestore(lock, flags); + + cancel_work_sync(&mdev->clear_work[channel].ws); + + mutex_lock(&mdev->io_mutex); + usb_kill_anchored_urbs(&mdev->busy_urbs[channel]); + if (mdev->padding_active[channel]) + mdev->padding_active[channel] = false; + + if (mdev->conf[channel].data_type == MOST_CH_ASYNC) { + del_timer_sync(&mdev->link_stat_timer); + cancel_work_sync(&mdev->poll_work_obj); + } + mutex_unlock(&mdev->io_mutex); + return 0; +} + +/** + * hdm_add_padding - add padding bytes + * @mdev: most device + * @channel: channel ID + * @mbo: buffer object + * + * This inserts the INIC hardware specific padding bytes into a streaming + * channel's buffer + */ +static int hdm_add_padding(struct most_dev *mdev, int channel, struct mbo *mbo) +{ + struct most_channel_config *conf = &mdev->conf[channel]; + unsigned int frame_size = get_stream_frame_size(conf); + unsigned int j, num_frames; + + if (!frame_size) + return -EINVAL; + num_frames = mbo->buffer_length / frame_size; + + if (num_frames < 1) { + dev_err(&mdev->usb_device->dev, + "Missed minimal transfer unit.\n"); + return -EINVAL; + } + + for (j = num_frames - 1; j > 0; j--) + memmove(mbo->virt_address + j * USB_MTU, + mbo->virt_address + j * frame_size, + frame_size); + mbo->buffer_length = num_frames * USB_MTU; + return 0; +} + +/** + * hdm_remove_padding - remove padding bytes + * @mdev: most device + * @channel: channel ID + * @mbo: buffer object + * + * This takes the INIC hardware specific padding bytes off a streaming + * channel's buffer. + */ +static int hdm_remove_padding(struct most_dev *mdev, int channel, + struct mbo *mbo) +{ + struct most_channel_config *const conf = &mdev->conf[channel]; + unsigned int frame_size = get_stream_frame_size(conf); + unsigned int j, num_frames; + + if (!frame_size) + return -EINVAL; + num_frames = mbo->processed_length / USB_MTU; + + for (j = 1; j < num_frames; j++) + memmove(mbo->virt_address + frame_size * j, + mbo->virt_address + USB_MTU * j, + frame_size); + + mbo->processed_length = frame_size * num_frames; + return 0; +} + +/** + * hdm_write_completion - completion function for submitted Tx URBs + * @urb: the URB that has been completed + * + * This checks the status of the completed URB. In case the URB has been + * unlinked before, it is immediately freed. On any other error the MBO + * transfer flag is set. On success it frees allocated resources and calls + * the completion function. + * + * Context: interrupt! + */ +static void hdm_write_completion(struct urb *urb) +{ + struct mbo *mbo = urb->context; + struct most_dev *mdev = to_mdev(mbo->ifp); + unsigned int channel = mbo->hdm_channel_id; + spinlock_t *lock = mdev->channel_lock + channel; + unsigned long flags; + + spin_lock_irqsave(lock, flags); + + mbo->processed_length = 0; + mbo->status = MBO_E_INVAL; + if (likely(mdev->is_channel_healthy[channel])) { + switch (urb->status) { + case 0: + case -ESHUTDOWN: + mbo->processed_length = urb->actual_length; + mbo->status = MBO_SUCCESS; + break; + case -EPIPE: + dev_warn(&mdev->usb_device->dev, + "Broken pipe on ep%02x\n", + mdev->ep_address[channel]); + mdev->is_channel_healthy[channel] = false; + mdev->clear_work[channel].pipe = urb->pipe; + schedule_work(&mdev->clear_work[channel].ws); + break; + case -ENODEV: + case -EPROTO: + mbo->status = MBO_E_CLOSE; + break; + } + } + + spin_unlock_irqrestore(lock, flags); + + if (likely(mbo->complete)) + mbo->complete(mbo); + usb_free_urb(urb); +} + +/** + * hdm_read_completion - completion function for submitted Rx URBs + * @urb: the URB that has been completed + * + * This checks the status of the completed URB. In case the URB has been + * unlinked before it is immediately freed. On any other error the MBO transfer + * flag is set. On success it frees allocated resources, removes + * padding bytes -if necessary- and calls the completion function. + * + * Context: interrupt! + * + * ************************************************************************** + * Error codes returned by in urb->status + * or in iso_frame_desc[n].status (for ISO) + * ************************************************************************* + * + * USB device drivers may only test urb status values in completion handlers. + * This is because otherwise there would be a race between HCDs updating + * these values on one CPU, and device drivers testing them on another CPU. + * + * A transfer's actual_length may be positive even when an error has been + * reported. That's because transfers often involve several packets, so that + * one or more packets could finish before an error stops further endpoint I/O. + * + * For isochronous URBs, the urb status value is non-zero only if the URB is + * unlinked, the device is removed, the host controller is disabled or the total + * transferred length is less than the requested length and the URB_SHORT_NOT_OK + * flag is set. Completion handlers for isochronous URBs should only see + * urb->status set to zero, -ENOENT, -ECONNRESET, -ESHUTDOWN, or -EREMOTEIO. + * Individual frame descriptor status fields may report more status codes. + * + * + * 0 Transfer completed successfully + * + * -ENOENT URB was synchronously unlinked by usb_unlink_urb + * + * -EINPROGRESS URB still pending, no results yet + * (That is, if drivers see this it's a bug.) + * + * -EPROTO (*, **) a) bitstuff error + * b) no response packet received within the + * prescribed bus turn-around time + * c) unknown USB error + * + * -EILSEQ (*, **) a) CRC mismatch + * b) no response packet received within the + * prescribed bus turn-around time + * c) unknown USB error + * + * Note that often the controller hardware does not + * distinguish among cases a), b), and c), so a + * driver cannot tell whether there was a protocol + * error, a failure to respond (often caused by + * device disconnect), or some other fault. + * + * -ETIME (**) No response packet received within the prescribed + * bus turn-around time. This error may instead be + * reported as -EPROTO or -EILSEQ. + * + * -ETIMEDOUT Synchronous USB message functions use this code + * to indicate timeout expired before the transfer + * completed, and no other error was reported by HC. + * + * -EPIPE (**) Endpoint stalled. For non-control endpoints, + * reset this status with usb_clear_halt(). + * + * -ECOMM During an IN transfer, the host controller + * received data from an endpoint faster than it + * could be written to system memory + * + * -ENOSR During an OUT transfer, the host controller + * could not retrieve data from system memory fast + * enough to keep up with the USB data rate + * + * -EOVERFLOW (*) The amount of data returned by the endpoint was + * greater than either the max packet size of the + * endpoint or the remaining buffer size. "Babble". + * + * -EREMOTEIO The data read from the endpoint did not fill the + * specified buffer, and URB_SHORT_NOT_OK was set in + * urb->transfer_flags. + * + * -ENODEV Device was removed. Often preceded by a burst of + * other errors, since the hub driver doesn't detect + * device removal events immediately. + * + * -EXDEV ISO transfer only partially completed + * (only set in iso_frame_desc[n].status, not urb->status) + * + * -EINVAL ISO madness, if this happens: Log off and go home + * + * -ECONNRESET URB was asynchronously unlinked by usb_unlink_urb + * + * -ESHUTDOWN The device or host controller has been disabled due + * to some problem that could not be worked around, + * such as a physical disconnect. + * + * + * (*) Error codes like -EPROTO, -EILSEQ and -EOVERFLOW normally indicate + * hardware problems such as bad devices (including firmware) or cables. + * + * (**) This is also one of several codes that different kinds of host + * controller use to indicate a transfer has failed because of device + * disconnect. In the interval before the hub driver starts disconnect + * processing, devices may receive such fault reports for every request. + * + * See + */ +static void hdm_read_completion(struct urb *urb) +{ + struct mbo *mbo = urb->context; + struct most_dev *mdev = to_mdev(mbo->ifp); + unsigned int channel = mbo->hdm_channel_id; + struct device *dev = &mdev->usb_device->dev; + spinlock_t *lock = mdev->channel_lock + channel; + unsigned long flags; + + spin_lock_irqsave(lock, flags); + + mbo->processed_length = 0; + mbo->status = MBO_E_INVAL; + if (likely(mdev->is_channel_healthy[channel])) { + switch (urb->status) { + case 0: + case -ESHUTDOWN: + mbo->processed_length = urb->actual_length; + mbo->status = MBO_SUCCESS; + if (mdev->padding_active[channel] && + hdm_remove_padding(mdev, channel, mbo)) { + mbo->processed_length = 0; + mbo->status = MBO_E_INVAL; + } + break; + case -EPIPE: + dev_warn(dev, "Broken pipe on ep%02x\n", + mdev->ep_address[channel]); + mdev->is_channel_healthy[channel] = false; + mdev->clear_work[channel].pipe = urb->pipe; + schedule_work(&mdev->clear_work[channel].ws); + break; + case -ENODEV: + case -EPROTO: + mbo->status = MBO_E_CLOSE; + break; + case -EOVERFLOW: + dev_warn(dev, "Babble on ep%02x\n", + mdev->ep_address[channel]); + break; + } + } + + spin_unlock_irqrestore(lock, flags); + + if (likely(mbo->complete)) + mbo->complete(mbo); + usb_free_urb(urb); +} + +/** + * hdm_enqueue - receive a buffer to be used for data transfer + * @iface: interface to enqueue to + * @channel: ID of the channel + * @mbo: pointer to the buffer object + * + * This allocates a new URB and fills it according to the channel + * that is being used for transmission of data. Before the URB is + * submitted it is stored in the private anchor list. + * + * Returns 0 on success. On any error the URB is freed and a error code + * is returned. + * + * Context: Could in _some_ cases be interrupt! + */ +static int hdm_enqueue(struct most_interface *iface, int channel, + struct mbo *mbo) +{ + struct most_dev *mdev = to_mdev(iface); + struct most_channel_config *conf; + int retval = 0; + struct urb *urb; + unsigned long length; + void *virt_address; + + if (!mbo) + return -EINVAL; + if (iface->num_channels <= channel || channel < 0) + return -ECHRNG; + + conf = &mdev->conf[channel]; + + mutex_lock(&mdev->io_mutex); + if (!mdev->usb_device) { + retval = -ENODEV; + goto unlock_io_mutex; + } + + urb = usb_alloc_urb(NO_ISOCHRONOUS_URB, GFP_ATOMIC); + if (!urb) { + retval = -ENOMEM; + goto unlock_io_mutex; + } + + if ((conf->direction & MOST_CH_TX) && mdev->padding_active[channel] && + hdm_add_padding(mdev, channel, mbo)) { + retval = -EINVAL; + goto err_free_urb; + } + + urb->transfer_dma = mbo->bus_address; + virt_address = mbo->virt_address; + length = mbo->buffer_length; + + if (conf->direction & MOST_CH_TX) { + usb_fill_bulk_urb(urb, mdev->usb_device, + usb_sndbulkpipe(mdev->usb_device, + mdev->ep_address[channel]), + virt_address, + length, + hdm_write_completion, + mbo); + if (conf->data_type != MOST_CH_ISOC && + conf->data_type != MOST_CH_SYNC) + urb->transfer_flags |= URB_ZERO_PACKET; + } else { + usb_fill_bulk_urb(urb, mdev->usb_device, + usb_rcvbulkpipe(mdev->usb_device, + mdev->ep_address[channel]), + virt_address, + length + conf->extra_len, + hdm_read_completion, + mbo); + } + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + usb_anchor_urb(urb, &mdev->busy_urbs[channel]); + + retval = usb_submit_urb(urb, GFP_KERNEL); + if (retval) { + dev_err(&mdev->usb_device->dev, + "URB submit failed with error %d.\n", retval); + goto err_unanchor_urb; + } + goto unlock_io_mutex; + +err_unanchor_urb: + usb_unanchor_urb(urb); +err_free_urb: + usb_free_urb(urb); +unlock_io_mutex: + mutex_unlock(&mdev->io_mutex); + return retval; +} + +static void *hdm_dma_alloc(struct mbo *mbo, u32 size) +{ + struct most_dev *mdev = to_mdev(mbo->ifp); + + return usb_alloc_coherent(mdev->usb_device, size, GFP_KERNEL, + &mbo->bus_address); +} + +static void hdm_dma_free(struct mbo *mbo, u32 size) +{ + struct most_dev *mdev = to_mdev(mbo->ifp); + + usb_free_coherent(mdev->usb_device, size, mbo->virt_address, + mbo->bus_address); +} + +/** + * hdm_configure_channel - receive channel configuration from core + * @iface: interface + * @channel: channel ID + * @conf: structure that holds the configuration information + * + * The attached network interface controller (NIC) supports a padding mode + * to avoid short packets on USB, hence increasing the performance due to a + * lower interrupt load. This mode is default for synchronous data and can + * be switched on for isochronous data. In case padding is active the + * driver needs to know the frame size of the payload in order to calculate + * the number of bytes it needs to pad when transmitting or to cut off when + * receiving data. + * + */ +static int hdm_configure_channel(struct most_interface *iface, int channel, + struct most_channel_config *conf) +{ + unsigned int num_frames; + unsigned int frame_size; + struct most_dev *mdev = to_mdev(iface); + struct device *dev = &mdev->usb_device->dev; + + mdev->is_channel_healthy[channel] = true; + mdev->clear_work[channel].channel = channel; + mdev->clear_work[channel].mdev = mdev; + INIT_WORK(&mdev->clear_work[channel].ws, wq_clear_halt); + + if (!conf) { + dev_err(dev, "Bad config pointer.\n"); + return -EINVAL; + } + if (channel < 0 || channel >= iface->num_channels) { + dev_err(dev, "Channel ID out of range.\n"); + return -EINVAL; + } + if (!conf->num_buffers || !conf->buffer_size) { + dev_err(dev, "Misconfig: buffer size or #buffers zero.\n"); + return -EINVAL; + } + + if (conf->data_type != MOST_CH_SYNC && + !(conf->data_type == MOST_CH_ISOC && + conf->packets_per_xact != 0xFF)) { + mdev->padding_active[channel] = false; + /* + * Since the NIC's padding mode is not going to be + * used, we can skip the frame size calculations and + * move directly on to exit. + */ + goto exit; + } + + mdev->padding_active[channel] = true; + + frame_size = get_stream_frame_size(conf); + if (frame_size == 0 || frame_size > USB_MTU) { + dev_warn(dev, "Misconfig: frame size wrong\n"); + return -EINVAL; + } + + num_frames = conf->buffer_size / frame_size; + + if (conf->buffer_size % frame_size) { + u16 old_size = conf->buffer_size; + + conf->buffer_size = num_frames * frame_size; + dev_warn(dev, "%s: fixed buffer size (%d -> %d)\n", + mdev->suffix[channel], old_size, conf->buffer_size); + } + + /* calculate extra length to comply w/ HW padding */ + conf->extra_len = num_frames * (USB_MTU - frame_size); + +exit: + mdev->conf[channel] = *conf; + if (conf->data_type == MOST_CH_ASYNC) { + u16 ep = mdev->ep_address[channel]; + + if (start_sync_ep(mdev->usb_device, ep) < 0) + dev_warn(dev, "sync for ep%02x failed", ep); + } + return 0; +} + +/** + * hdm_request_netinfo - request network information + * @iface: pointer to interface + * @channel: channel ID + * + * This is used as trigger to set up the link status timer that + * polls for the NI state of the INIC every 2 seconds. + * + */ +static void hdm_request_netinfo(struct most_interface *iface, int channel, + void (*on_netinfo)(struct most_interface *, + unsigned char, + unsigned char *)) +{ + struct most_dev *mdev = to_mdev(iface); + + mdev->on_netinfo = on_netinfo; + if (!on_netinfo) + return; + + mdev->link_stat_timer.expires = jiffies + HZ; + mod_timer(&mdev->link_stat_timer, mdev->link_stat_timer.expires); +} + +/** + * link_stat_timer_handler - schedule work obtaining mac address and link status + * @data: pointer to USB device instance + * + * The handler runs in interrupt context. That's why we need to defer the + * tasks to a work queue. + */ +static void link_stat_timer_handler(struct timer_list *t) +{ + struct most_dev *mdev = from_timer(mdev, t, link_stat_timer); + + schedule_work(&mdev->poll_work_obj); + mdev->link_stat_timer.expires = jiffies + (2 * HZ); + add_timer(&mdev->link_stat_timer); +} + +/** + * wq_netinfo - work queue function to deliver latest networking information + * @wq_obj: object that holds data for our deferred work to do + * + * This retrieves the network interface status of the USB INIC + */ +static void wq_netinfo(struct work_struct *wq_obj) +{ + struct most_dev *mdev = to_mdev_from_work(wq_obj); + struct usb_device *usb_device = mdev->usb_device; + struct device *dev = &usb_device->dev; + u16 hi, mi, lo, link; + u8 hw_addr[6]; + + if (drci_rd_reg(usb_device, DRCI_REG_HW_ADDR_HI, &hi) < 0) { + dev_err(dev, "Vendor request 'hw_addr_hi' failed\n"); + return; + } + + if (drci_rd_reg(usb_device, DRCI_REG_HW_ADDR_MI, &mi) < 0) { + dev_err(dev, "Vendor request 'hw_addr_mid' failed\n"); + return; + } + + if (drci_rd_reg(usb_device, DRCI_REG_HW_ADDR_LO, &lo) < 0) { + dev_err(dev, "Vendor request 'hw_addr_low' failed\n"); + return; + } + + if (drci_rd_reg(usb_device, DRCI_REG_NI_STATE, &link) < 0) { + dev_err(dev, "Vendor request 'link status' failed\n"); + return; + } + + hw_addr[0] = hi >> 8; + hw_addr[1] = hi; + hw_addr[2] = mi >> 8; + hw_addr[3] = mi; + hw_addr[4] = lo >> 8; + hw_addr[5] = lo; + + if (mdev->on_netinfo) + mdev->on_netinfo(&mdev->iface, link, hw_addr); +} + +/** + * wq_clear_halt - work queue function + * @wq_obj: work_struct object to execute + * + * This sends a clear_halt to the given USB pipe. + */ +static void wq_clear_halt(struct work_struct *wq_obj) +{ + struct clear_hold_work *clear_work = to_clear_hold_work(wq_obj); + struct most_dev *mdev = clear_work->mdev; + unsigned int channel = clear_work->channel; + int pipe = clear_work->pipe; + + mutex_lock(&mdev->io_mutex); + most_stop_enqueue(&mdev->iface, channel); + usb_kill_anchored_urbs(&mdev->busy_urbs[channel]); + if (usb_clear_halt(mdev->usb_device, pipe)) + dev_warn(&mdev->usb_device->dev, "Failed to reset endpoint.\n"); + + /* If the functional Stall condition has been set on an + * asynchronous rx channel, we need to clear the tx channel + * too, since the hardware runs its clean-up sequence on both + * channels, as they are physically one on the network. + * + * The USB interface that exposes the asynchronous channels + * contains always two endpoints, and two only. + */ + if (mdev->conf[channel].data_type == MOST_CH_ASYNC && + mdev->conf[channel].direction == MOST_CH_RX) { + int peer = 1 - channel; + int snd_pipe = usb_sndbulkpipe(mdev->usb_device, + mdev->ep_address[peer]); + usb_clear_halt(mdev->usb_device, snd_pipe); + } + mdev->is_channel_healthy[channel] = true; + most_resume_enqueue(&mdev->iface, channel); + mutex_unlock(&mdev->io_mutex); +} + +/** + * hdm_usb_fops - file operation table for USB driver + */ +static const struct file_operations hdm_usb_fops = { + .owner = THIS_MODULE, +}; + +/** + * usb_device_id - ID table for HCD device probing + */ +static const struct usb_device_id usbid[] = { + { USB_DEVICE(USB_VENDOR_ID_SMSC, USB_DEV_ID_BRDG), }, + { USB_DEVICE(USB_VENDOR_ID_SMSC, USB_DEV_ID_OS81118), }, + { USB_DEVICE(USB_VENDOR_ID_SMSC, USB_DEV_ID_OS81119), }, + { USB_DEVICE(USB_VENDOR_ID_SMSC, USB_DEV_ID_OS81210), }, + { } /* Terminating entry */ +}; + +struct regs { + const char *name; + u16 reg; +}; + +static const struct regs ro_regs[] = { + { "ni_state", DRCI_REG_NI_STATE }, + { "packet_bandwidth", DRCI_REG_PACKET_BW }, + { "node_address", DRCI_REG_NODE_ADDR }, + { "node_position", DRCI_REG_NODE_POS }, +}; + +static const struct regs rw_regs[] = { + { "mep_filter", DRCI_REG_MEP_FILTER }, + { "mep_hash0", DRCI_REG_HASH_TBL0 }, + { "mep_hash1", DRCI_REG_HASH_TBL1 }, + { "mep_hash2", DRCI_REG_HASH_TBL2 }, + { "mep_hash3", DRCI_REG_HASH_TBL3 }, + { "mep_eui48_hi", DRCI_REG_HW_ADDR_HI }, + { "mep_eui48_mi", DRCI_REG_HW_ADDR_MI }, + { "mep_eui48_lo", DRCI_REG_HW_ADDR_LO }, +}; + +static int get_stat_reg_addr(const struct regs *regs, int size, + const char *name, u16 *reg_addr) +{ + int i; + + for (i = 0; i < size; i++) { + if (!strcmp(name, regs[i].name)) { + *reg_addr = regs[i].reg; + return 0; + } + } + return -EFAULT; +} + +#define get_static_reg_addr(regs, name, reg_addr) \ + get_stat_reg_addr(regs, ARRAY_SIZE(regs), name, reg_addr) + +static ssize_t value_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + const char *name = attr->attr.name; + struct most_dci_obj *dci_obj = to_dci_obj(dev); + u16 val; + u16 reg_addr; + int err; + + if (!strcmp(name, "arb_address")) + return snprintf(buf, PAGE_SIZE, "%04x\n", dci_obj->reg_addr); + + if (!strcmp(name, "arb_value")) + reg_addr = dci_obj->reg_addr; + else if (get_static_reg_addr(ro_regs, name, ®_addr) && + get_static_reg_addr(rw_regs, name, ®_addr)) + return -EFAULT; + + err = drci_rd_reg(dci_obj->usb_device, reg_addr, &val); + if (err < 0) + return err; + + return snprintf(buf, PAGE_SIZE, "%04x\n", val); +} + +static ssize_t value_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + u16 val; + u16 reg_addr; + const char *name = attr->attr.name; + struct most_dci_obj *dci_obj = to_dci_obj(dev); + struct usb_device *usb_dev = dci_obj->usb_device; + int err = kstrtou16(buf, 16, &val); + + if (err) + return err; + + if (!strcmp(name, "arb_address")) { + dci_obj->reg_addr = val; + return count; + } + + if (!strcmp(name, "arb_value")) + err = drci_wr_reg(usb_dev, dci_obj->reg_addr, val); + else if (!strcmp(name, "sync_ep")) + err = start_sync_ep(usb_dev, val); + else if (!get_static_reg_addr(rw_regs, name, ®_addr)) + err = drci_wr_reg(usb_dev, reg_addr, val); + else + return -EFAULT; + + if (err < 0) + return err; + + return count; +} + +static DEVICE_ATTR(ni_state, 0444, value_show, NULL); +static DEVICE_ATTR(packet_bandwidth, 0444, value_show, NULL); +static DEVICE_ATTR(node_address, 0444, value_show, NULL); +static DEVICE_ATTR(node_position, 0444, value_show, NULL); +static DEVICE_ATTR(sync_ep, 0200, NULL, value_store); +static DEVICE_ATTR(mep_filter, 0644, value_show, value_store); +static DEVICE_ATTR(mep_hash0, 0644, value_show, value_store); +static DEVICE_ATTR(mep_hash1, 0644, value_show, value_store); +static DEVICE_ATTR(mep_hash2, 0644, value_show, value_store); +static DEVICE_ATTR(mep_hash3, 0644, value_show, value_store); +static DEVICE_ATTR(mep_eui48_hi, 0644, value_show, value_store); +static DEVICE_ATTR(mep_eui48_mi, 0644, value_show, value_store); +static DEVICE_ATTR(mep_eui48_lo, 0644, value_show, value_store); +static DEVICE_ATTR(arb_address, 0644, value_show, value_store); +static DEVICE_ATTR(arb_value, 0644, value_show, value_store); + +static struct attribute *dci_attrs[] = { + &dev_attr_ni_state.attr, + &dev_attr_packet_bandwidth.attr, + &dev_attr_node_address.attr, + &dev_attr_node_position.attr, + &dev_attr_sync_ep.attr, + &dev_attr_mep_filter.attr, + &dev_attr_mep_hash0.attr, + &dev_attr_mep_hash1.attr, + &dev_attr_mep_hash2.attr, + &dev_attr_mep_hash3.attr, + &dev_attr_mep_eui48_hi.attr, + &dev_attr_mep_eui48_mi.attr, + &dev_attr_mep_eui48_lo.attr, + &dev_attr_arb_address.attr, + &dev_attr_arb_value.attr, + NULL, +}; + +static struct attribute_group dci_attr_group = { + .attrs = dci_attrs, +}; + +static const struct attribute_group *dci_attr_groups[] = { + &dci_attr_group, + NULL, +}; + +static void release_dci(struct device *dev) +{ + struct most_dci_obj *dci = to_dci_obj(dev); + + kfree(dci); +} + +static void release_mdev(struct device *dev) +{ + struct most_dev *mdev = to_mdev_from_dev(dev); + + kfree(mdev); +} +/** + * hdm_probe - probe function of USB device driver + * @interface: Interface of the attached USB device + * @id: Pointer to the USB ID table. + * + * This allocates and initializes the device instance, adds the new + * entry to the internal list, scans the USB descriptors and registers + * the interface with the core. + * Additionally, the DCI objects are created and the hardware is sync'd. + * + * Return 0 on success. In case of an error a negative number is returned. + */ +static int +hdm_probe(struct usb_interface *interface, const struct usb_device_id *id) +{ + struct usb_host_interface *usb_iface_desc = interface->cur_altsetting; + struct usb_device *usb_dev = interface_to_usbdev(interface); + struct device *dev = &usb_dev->dev; + struct most_dev *mdev = kzalloc(sizeof(*mdev), GFP_KERNEL); + unsigned int i; + unsigned int num_endpoints; + struct most_channel_capability *tmp_cap; + struct usb_endpoint_descriptor *ep_desc; + int ret = 0; + + if (!mdev) + goto err_out_of_memory; + + usb_set_intfdata(interface, mdev); + num_endpoints = usb_iface_desc->desc.bNumEndpoints; + mutex_init(&mdev->io_mutex); + INIT_WORK(&mdev->poll_work_obj, wq_netinfo); + timer_setup(&mdev->link_stat_timer, link_stat_timer_handler, 0); + + mdev->usb_device = usb_dev; + mdev->link_stat_timer.expires = jiffies + (2 * HZ); + + mdev->iface.mod = hdm_usb_fops.owner; + mdev->iface.dev = &mdev->dev; + mdev->iface.driver_dev = &interface->dev; + mdev->iface.interface = ITYPE_USB; + mdev->iface.configure = hdm_configure_channel; + mdev->iface.request_netinfo = hdm_request_netinfo; + mdev->iface.enqueue = hdm_enqueue; + mdev->iface.poison_channel = hdm_poison_channel; + mdev->iface.dma_alloc = hdm_dma_alloc; + mdev->iface.dma_free = hdm_dma_free; + mdev->iface.description = mdev->description; + mdev->iface.num_channels = num_endpoints; + + snprintf(mdev->description, sizeof(mdev->description), + "%d-%s:%d.%d", + usb_dev->bus->busnum, + usb_dev->devpath, + usb_dev->config->desc.bConfigurationValue, + usb_iface_desc->desc.bInterfaceNumber); + + mdev->dev.init_name = mdev->description; + mdev->dev.parent = &interface->dev; + mdev->dev.release = release_mdev; + mdev->conf = kcalloc(num_endpoints, sizeof(*mdev->conf), GFP_KERNEL); + if (!mdev->conf) + goto err_free_mdev; + + mdev->cap = kcalloc(num_endpoints, sizeof(*mdev->cap), GFP_KERNEL); + if (!mdev->cap) + goto err_free_conf; + + mdev->iface.channel_vector = mdev->cap; + mdev->ep_address = + kcalloc(num_endpoints, sizeof(*mdev->ep_address), GFP_KERNEL); + if (!mdev->ep_address) + goto err_free_cap; + + mdev->busy_urbs = + kcalloc(num_endpoints, sizeof(*mdev->busy_urbs), GFP_KERNEL); + if (!mdev->busy_urbs) + goto err_free_ep_address; + + tmp_cap = mdev->cap; + for (i = 0; i < num_endpoints; i++) { + ep_desc = &usb_iface_desc->endpoint[i].desc; + mdev->ep_address[i] = ep_desc->bEndpointAddress; + mdev->padding_active[i] = false; + mdev->is_channel_healthy[i] = true; + + snprintf(&mdev->suffix[i][0], MAX_SUFFIX_LEN, "ep%02x", + mdev->ep_address[i]); + + tmp_cap->name_suffix = &mdev->suffix[i][0]; + tmp_cap->buffer_size_packet = MAX_BUF_SIZE; + tmp_cap->buffer_size_streaming = MAX_BUF_SIZE; + tmp_cap->num_buffers_packet = BUF_CHAIN_SIZE; + tmp_cap->num_buffers_streaming = BUF_CHAIN_SIZE; + tmp_cap->data_type = MOST_CH_CONTROL | MOST_CH_ASYNC | + MOST_CH_ISOC | MOST_CH_SYNC; + if (usb_endpoint_dir_in(ep_desc)) + tmp_cap->direction = MOST_CH_RX; + else + tmp_cap->direction = MOST_CH_TX; + tmp_cap++; + init_usb_anchor(&mdev->busy_urbs[i]); + spin_lock_init(&mdev->channel_lock[i]); + } + dev_notice(dev, "claimed gadget: Vendor=%4.4x ProdID=%4.4x Bus=%02x Device=%02x\n", + le16_to_cpu(usb_dev->descriptor.idVendor), + le16_to_cpu(usb_dev->descriptor.idProduct), + usb_dev->bus->busnum, + usb_dev->devnum); + + dev_notice(dev, "device path: /sys/bus/usb/devices/%d-%s:%d.%d\n", + usb_dev->bus->busnum, + usb_dev->devpath, + usb_dev->config->desc.bConfigurationValue, + usb_iface_desc->desc.bInterfaceNumber); + + ret = most_register_interface(&mdev->iface); + if (ret) + goto err_free_busy_urbs; + + mutex_lock(&mdev->io_mutex); + if (le16_to_cpu(usb_dev->descriptor.idProduct) == USB_DEV_ID_OS81118 || + le16_to_cpu(usb_dev->descriptor.idProduct) == USB_DEV_ID_OS81119 || + le16_to_cpu(usb_dev->descriptor.idProduct) == USB_DEV_ID_OS81210) { + mdev->dci = kzalloc(sizeof(*mdev->dci), GFP_KERNEL); + if (!mdev->dci) { + mutex_unlock(&mdev->io_mutex); + most_deregister_interface(&mdev->iface); + ret = -ENOMEM; + goto err_free_busy_urbs; + } + + mdev->dci->dev.init_name = "dci"; + mdev->dci->dev.parent = get_device(mdev->iface.dev); + mdev->dci->dev.groups = dci_attr_groups; + mdev->dci->dev.release = release_dci; + if (device_register(&mdev->dci->dev)) { + mutex_unlock(&mdev->io_mutex); + most_deregister_interface(&mdev->iface); + ret = -ENOMEM; + goto err_free_dci; + } + mdev->dci->usb_device = mdev->usb_device; + } + mutex_unlock(&mdev->io_mutex); + return 0; +err_free_dci: + put_device(&mdev->dci->dev); +err_free_busy_urbs: + kfree(mdev->busy_urbs); +err_free_ep_address: + kfree(mdev->ep_address); +err_free_cap: + kfree(mdev->cap); +err_free_conf: + kfree(mdev->conf); +err_free_mdev: + put_device(&mdev->dev); +err_out_of_memory: + if (ret == 0 || ret == -ENOMEM) { + ret = -ENOMEM; + dev_err(dev, "out of memory\n"); + } + return ret; +} + +/** + * hdm_disconnect - disconnect function of USB device driver + * @interface: Interface of the attached USB device + * + * This deregisters the interface with the core, removes the kernel timer + * and frees resources. + * + * Context: hub kernel thread + */ +static void hdm_disconnect(struct usb_interface *interface) +{ + struct most_dev *mdev = usb_get_intfdata(interface); + + mutex_lock(&mdev->io_mutex); + usb_set_intfdata(interface, NULL); + mdev->usb_device = NULL; + mutex_unlock(&mdev->io_mutex); + + del_timer_sync(&mdev->link_stat_timer); + cancel_work_sync(&mdev->poll_work_obj); + + if (mdev->dci) + device_unregister(&mdev->dci->dev); + most_deregister_interface(&mdev->iface); + + kfree(mdev->busy_urbs); + kfree(mdev->cap); + kfree(mdev->conf); + kfree(mdev->ep_address); + put_device(&mdev->dev); +} + +static int hdm_suspend(struct usb_interface *interface, pm_message_t message) +{ + struct most_dev *mdev = usb_get_intfdata(interface); + int i; + + mutex_lock(&mdev->io_mutex); + for (i = 0; i < mdev->iface.num_channels; i++) { + most_stop_enqueue(&mdev->iface, i); + usb_kill_anchored_urbs(&mdev->busy_urbs[i]); + } + mutex_unlock(&mdev->io_mutex); + return 0; +} + +static int hdm_resume(struct usb_interface *interface) +{ + struct most_dev *mdev = usb_get_intfdata(interface); + int i; + + mutex_lock(&mdev->io_mutex); + for (i = 0; i < mdev->iface.num_channels; i++) + most_resume_enqueue(&mdev->iface, i); + mutex_unlock(&mdev->io_mutex); + return 0; +} + +static struct usb_driver hdm_usb = { + .name = "hdm_usb", + .id_table = usbid, + .probe = hdm_probe, + .disconnect = hdm_disconnect, + .resume = hdm_resume, + .suspend = hdm_suspend, +}; + +module_usb_driver(hdm_usb); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Christian Gromm "); +MODULE_DESCRIPTION("HDM_4_USB"); From patchwork Thu May 14 09:52:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548421 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AC15F697 for ; Thu, 14 May 2020 09:53:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 96F7820722 for ; Thu, 14 May 2020 09:53:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="l1Q5WKaB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726113AbgENJxG (ORCPT ); Thu, 14 May 2020 05:53:06 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:51736 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725946AbgENJxF (ORCPT ); Thu, 14 May 2020 05:53:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449984; x=1620985984; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=XaiyOzJbm9tSQ61/hL3KmBzEmbAKGicNIZ5Lz5YPXeg=; b=l1Q5WKaBgiZwh6ATgg3FQuJX5Ka1KCSOqHzdY6VqcbYWhELg0/Mv56K6 MT5it9qINCcA+OVxCQJgdAJLzFF5kIjk8zGAUG4KYFfQnXeX1/tzR4TgN QUbUP82vLw4A/ct3NteueoEwu5rgBX7Bj3M2wmCh43qr/5j65xMTOc4Jt sFiyVq+KMq2CdfB3ClQuCkuZ6NUWSwm76URyGIcEYkqMv0extVTWChPKx fPtjnjkikr6YMspAE2TaTgggcyEs7wAtoaySpzBkqjpjsezWL/76sAaUy bsZknVwJCZiwWh84QFvcOOuR6jpIo9GMfxTtjO4sd3YV1SaVvQszP7jdN Q==; IronPort-SDR: R/pp8qEZdCEbOKg1Aa/xvbar2wtBHLJSFk+z6KsvVsFkSuSj/dDfV/BqfIzHKMJ/awhPK9rnfP VITdidjD2a4XR2/aUQUa3FyJw45H5EBHUWV2JQojx3YMoW2LhSJCk6WgbrWVR2Mp46oTIcu8pY e4TZTxttgz0CYNocnP7f2DdGNAt1tKX3ym7eIFLhmOq7ehyRl6oj67GAvtjWtm96xfCogVb/HE U0EdToCKDKKUEH+/PG+//0k33GwGow5pRSikBQJHFH5lr4/jFVKrNbFPBR9mefymiLmtc98VPi zsc= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="76630476" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:03 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:02 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:01 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 2/8] drivers: most: usb: use dev_*() functions to print messages Date: Thu, 14 May 2020 11:52:50 +0200 Message-ID: <1589449976-11378-3-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch removes the pr_*() functions and uses dev_*() instead. Signed-off-by: Christian Gromm Reported-by: Greg Kroah-Hartman --- v2: drivers/most/most_usb.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/most/most_usb.c b/drivers/most/most_usb.c index daa5e4b..0846b38 100644 --- a/drivers/most/most_usb.c +++ b/drivers/most/most_usb.c @@ -5,7 +5,6 @@ * Copyright (C) 2013-2015 Microchip Technology Germany II GmbH & Co. KG */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include #include #include @@ -186,13 +185,14 @@ static inline int start_sync_ep(struct usb_device *usb_dev, u16 ep) * get_stream_frame_size - calculate frame size of current configuration * @cfg: channel configuration */ -static unsigned int get_stream_frame_size(struct most_channel_config *cfg) +static unsigned int get_stream_frame_size(struct most_channel_config *cfg, + struct device *dev) { unsigned int frame_size = 0; unsigned int sub_size = cfg->subbuffer_size; if (!sub_size) { - pr_warn("Misconfig: Subbuffer size zero.\n"); + dev_warn(dev, "Misconfig: Subbuffer size zero.\n"); return frame_size; } switch (cfg->data_type) { @@ -201,7 +201,7 @@ static unsigned int get_stream_frame_size(struct most_channel_config *cfg) break; case MOST_CH_SYNC: if (cfg->packets_per_xact == 0) { - pr_warn("Misconfig: Packets per XACT zero\n"); + dev_warn(dev, "Misconfig: Packets per XACT zero\n"); frame_size = 0; } else if (cfg->packets_per_xact == 0xFF) { frame_size = (USB_MTU / sub_size) * sub_size; @@ -210,7 +210,7 @@ static unsigned int get_stream_frame_size(struct most_channel_config *cfg) } break; default: - pr_warn("Query frame size of non-streaming channel\n"); + dev_warn(dev, "Query frame size of non-streaming channel\n"); break; } return frame_size; @@ -270,7 +270,7 @@ static int hdm_poison_channel(struct most_interface *iface, int channel) static int hdm_add_padding(struct most_dev *mdev, int channel, struct mbo *mbo) { struct most_channel_config *conf = &mdev->conf[channel]; - unsigned int frame_size = get_stream_frame_size(conf); + unsigned int frame_size = get_stream_frame_size(conf, &mdev->dev); unsigned int j, num_frames; if (!frame_size) @@ -304,7 +304,7 @@ static int hdm_remove_padding(struct most_dev *mdev, int channel, struct mbo *mbo) { struct most_channel_config *const conf = &mdev->conf[channel]; - unsigned int frame_size = get_stream_frame_size(conf); + unsigned int frame_size = get_stream_frame_size(conf, &mdev->dev); unsigned int j, num_frames; if (!frame_size) @@ -696,7 +696,7 @@ static int hdm_configure_channel(struct most_interface *iface, int channel, mdev->padding_active[channel] = true; - frame_size = get_stream_frame_size(conf); + frame_size = get_stream_frame_size(conf, &mdev->dev); if (frame_size == 0 || frame_size > USB_MTU) { dev_warn(dev, "Misconfig: frame size wrong\n"); return -EINVAL; From patchwork Thu May 14 09:52:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548423 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 344B9139A for ; Thu, 14 May 2020 09:53:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1FE7A206DA for ; Thu, 14 May 2020 09:53:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="hCe1GCst" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726116AbgENJxG (ORCPT ); Thu, 14 May 2020 05:53:06 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:51742 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726037AbgENJxF (ORCPT ); Thu, 14 May 2020 05:53:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449984; x=1620985984; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=XQTa58qUeJuhzxM/FNXFxnIbhZJuNUPuS+qW9gZgjBI=; b=hCe1GCstZYBF5NMXnZrHiE5bj2aNaG2+j7ZYcLvKY/zN37vdMugZAHjH cefa1WLP6heDZbwJTrf3wAVajzyfm0N31bwOd8NM/uzB0M/WtCQLDhBS7 Vz13kYQ77Sd+F5kaB34M2pzoJz21fW46R1noGyAVKLBqJ5dFGF0RhpaIP FlLEiWmtKfE5oN/2+yKFiM6X/gTB1WPrdecZLxAi3JJHGEdILm/S84NZH gJl4lMhU1EnDdFdyJ8oiKB/ecspYNWcQya+W0JEpnhUrh5U9Km2fL3go0 OQY351kZtjaXoge5axURrptpY1JENBvu7YsCxShPWThmAHFyGdQRCbVW+ g==; IronPort-SDR: gqJo9s9O/+ithtdDTS78AXTAjvJ8Cv0eJFpfPrb5N4PToXTmJkkCJNcwM88I4PCpkoX/P9+FAg NUEmcEOEor1YOuTA9rklfY2H/dwto4tn8HSX+VOkSUMP0D+saz9UoQ9Dl7tVtKkXOVU4C06OGl aLOzWvQkyXxLa2uddHmL7zqEuzO2gM1E79apkKB3sX7JPJjGDIb8zfLdTK40yaI93zpFj5wIxs 6tjBcGzN5LmfjKXVg/8GrSMTAQtJNhu/VMcuWxTSPPRrvdYBjcV02JlMe1GTZGqEF2B1zyN9Hd Pi0= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="76630477" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:04 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:03 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:02 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 3/8] drivers: most: usb: remove reference to USB error codes Date: Thu, 14 May 2020 11:52:51 +0200 Message-ID: <1589449976-11378-4-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch removes the reference to the driver API file for USB error codes. Signed-off-by: Christian Gromm Reported-by: Greg Kroah-Hartman --- v2: drivers/most/most_usb.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/most/most_usb.c b/drivers/most/most_usb.c index 0846b38..49d0b40 100644 --- a/drivers/most/most_usb.c +++ b/drivers/most/most_usb.c @@ -477,8 +477,6 @@ static void hdm_write_completion(struct urb *urb) * controller use to indicate a transfer has failed because of device * disconnect. In the interval before the hub driver starts disconnect * processing, devices may receive such fault reports for every request. - * - * See */ static void hdm_read_completion(struct urb *urb) { From patchwork Thu May 14 09:52:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548425 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 23CC6697 for ; Thu, 14 May 2020 09:53:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0E41D20671 for ; Thu, 14 May 2020 09:53:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="indvnUJE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726117AbgENJxH (ORCPT ); Thu, 14 May 2020 05:53:07 -0400 Received: from esa2.microchip.iphmx.com ([68.232.149.84]:37259 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726050AbgENJxG (ORCPT ); Thu, 14 May 2020 05:53:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449985; x=1620985985; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=Mmw5hIPN0sKQmWjs3u78F9H5tWaBpxFqYIUb5M3NgL0=; b=indvnUJEv0mUipQPOw1ckWoPPvTQjCmN1EapOvjsf02f4aVFsxNdHi/a f7HHolNwubZ+qZ3dQVTLzPbFUOea+IAaflixGBdbZBsf4C4Qzt1htMXiG t3e2Exdwmjsj8E3/OKD3yC0QLC4g5UjoXvlt3gmEPU/ZXpqVZLNbg7Aaj Qzs1ZJhkKBJJtdmMOAbbjeWCopfLo/MqrfgKY2ZNE9KLeqzOY/y1tOHcf E/AS+NbZfzDowDDPrxmd/IKuz3eRiHqWCFToRjZCOq1tGmSAhA6VYRqa0 g3+1AUAQ7o3nGKD3sWvKbq6GRIu9EKwusDugBbDlx85r1WGq0i4FEgqss A==; IronPort-SDR: Pb+6G9Wuk+s0TdWRLxI6dy9N3aB6clfYRYun3iDWldHb7ralsK6p26Xwf0YcxkmwHRbwLVAtY9 YKKp1e+RL4rPdX25ePYaQFrnOTJ0UWSaVK4gA0xdIlr0pQA6dh6q9J+6MZaZGWTifHMbhfpK1D iW+doTtZkXSQCmBJEmAlwCQtXSgNgj3GrsXyE82IvuNyeoTjQirHRVgY5EaY2mfjyfuPG8M1nI Us6Tg8huRFB5pj2AzqFzad8heh66OwQA+KaIsR+EC7YOov0gg1KhVBnE17IoobI+YGrkaFJz66 HT4= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="75245167" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:05 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:04 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:04 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 4/8] drivers: most: usb: check number of reported endpoints Date: Thu, 14 May 2020 11:52:52 +0200 Message-ID: <1589449976-11378-5-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch checks the number of endpoints reported by the USB interface descriptor and throws an error if the number exceeds MAX_NUM_ENDPOINTS. Signed-off-by: Christian Gromm Reported-by: Greg Kroah-Hartman Reported-by: kbuild test robot --- v2: drivers/most/most_usb.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/drivers/most/most_usb.c b/drivers/most/most_usb.c index 49d0b40..1655fcd 100644 --- a/drivers/most/most_usb.c +++ b/drivers/most/most_usb.c @@ -1044,13 +1044,17 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id) unsigned int num_endpoints; struct most_channel_capability *tmp_cap; struct usb_endpoint_descriptor *ep_desc; - int ret = 0; + int ret; if (!mdev) - goto err_out_of_memory; + return -ENOMEM; usb_set_intfdata(interface, mdev); num_endpoints = usb_iface_desc->desc.bNumEndpoints; + if (num_endpoints > MAX_NUM_ENDPOINTS) { + kfree(mdev); + return -EINVAL; + } mutex_init(&mdev->io_mutex); INIT_WORK(&mdev->poll_work_obj, wq_netinfo); timer_setup(&mdev->link_stat_timer, link_stat_timer_handler, 0); @@ -1179,11 +1183,6 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id) kfree(mdev->conf); err_free_mdev: put_device(&mdev->dev); -err_out_of_memory: - if (ret == 0 || ret == -ENOMEM) { - ret = -ENOMEM; - dev_err(dev, "out of memory\n"); - } return ret; } From patchwork Thu May 14 09:52:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548429 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 18E74697 for ; Thu, 14 May 2020 09:53:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 01C62206DA for ; Thu, 14 May 2020 09:53:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="NqflolDY" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726133AbgENJxJ (ORCPT ); Thu, 14 May 2020 05:53:09 -0400 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:61878 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726119AbgENJxI (ORCPT ); Thu, 14 May 2020 05:53:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449988; x=1620985988; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=ulFIoRuFlAhbgBKdyPyVoH1HEiouU5Elxw0OIIY1pcQ=; b=NqflolDYci8TG3eyax4SuyhVL8BLFmCD03VbNSQLD736raf/GEdP7UvU hRzoMZjgmva3GxefR49rVni/2BWa16TwiuUhhWq1u/gVpUFylElrnOzwi q+R2VYAvSN4iWb63NP/Bx38cMee3rhnmsmhcWvrfbP3ooYMthdzpe8QeG JMJqD69e5IVE8RMCx7zNCWz7DO4HXQFR93XnfqhZeYwsUv4Rwv1/yAr+8 FSnx49oa9dA3pm4ivTOOmsOPTWslYkZr0lB7MxYwYxQqNoHMm8tQGgic4 k3or0JFn1c3nVLCIqM2XlbqZYzieJ59gIp9R/xnH12pMznv/GqNgST2XY A==; IronPort-SDR: TM7+S6WU4eYPGBPIPzHkhIql2l8pYsqIPF+JMTyc2i432h/zcoWusOV06+MzErVFQRGnmDiosP w/iZ/MrQMtx2M+KFkM3Vn2Uh0616G4Zqqdne1RTdcJMv2jLzSz72sgNd/UUfHpWED0lbTENucI 6YkgwPGJjmsrpjqgw5bFRW+mzCIMliQIxAvOfnJ8rj6ho3u8+v/UrHQcqRmHWVTH+Z/+D4fLeT BzWVlCNVpUOVGhoKtNOWrCGOkEpjVrEg+OPf/w78FbmojNitpW8Q7W0UC7fTnBrZ+elSw0LrRq 254= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="73430412" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:07 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:06 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:05 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 5/8] drivers: most: usb: use dev_dbg function Date: Thu, 14 May 2020 11:52:53 +0200 Message-ID: <1589449976-11378-6-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch replaces the functions dev_notice with dev_dbg to silence the driver during normal operation. Signed-off-by: Christian Gromm Reported-by: Greg Kroah-Hartman --- v2: drivers/most/most_usb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/most/most_usb.c b/drivers/most/most_usb.c index 1655fcd..35620a1 100644 --- a/drivers/most/most_usb.c +++ b/drivers/most/most_usb.c @@ -1129,13 +1129,13 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id) init_usb_anchor(&mdev->busy_urbs[i]); spin_lock_init(&mdev->channel_lock[i]); } - dev_notice(dev, "claimed gadget: Vendor=%4.4x ProdID=%4.4x Bus=%02x Device=%02x\n", + dev_dbg(dev, "claimed gadget: Vendor=%4.4x ProdID=%4.4x Bus=%02x Device=%02x\n", le16_to_cpu(usb_dev->descriptor.idVendor), le16_to_cpu(usb_dev->descriptor.idProduct), usb_dev->bus->busnum, usb_dev->devnum); - dev_notice(dev, "device path: /sys/bus/usb/devices/%d-%s:%d.%d\n", + dev_dbg(dev, "device path: /sys/bus/usb/devices/%d-%s:%d.%d\n", usb_dev->bus->busnum, usb_dev->devpath, usb_dev->config->desc.bConfigurationValue, From patchwork Thu May 14 09:52:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548427 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 57D3E1391 for ; Thu, 14 May 2020 09:53:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 4301A20722 for ; Thu, 14 May 2020 09:53:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="uOeGS0/b" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726128AbgENJxJ (ORCPT ); Thu, 14 May 2020 05:53:09 -0400 Received: from esa2.microchip.iphmx.com ([68.232.149.84]:37259 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726050AbgENJxI (ORCPT ); Thu, 14 May 2020 05:53:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449987; x=1620985987; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=FiT6KA+3tggUbq0sZ6v1AT6SWXbGH6Gme6onwqj5nyI=; b=uOeGS0/bJXubTdTGx2SjcP9xuNT8n878vf78m8wR+XNpyTrz98/ITxne cOscWqISs/2u36SDzEs4GuPxSmrZd0xtkjcc2VNnL40n8UT2EtoCeOwWp SQp4XFk23FjWBm8BwF4/9/uyqCDBKU9gt6SsAUEYxCBhw+P2FPbOI3Ti6 ysb4j4PrzULjnKukB4LXZFzpXiJzwoh5NopLbDAw7RE4/El/OCZ8FJhdv A12pUpKJzeoN8q4HTT1F21qd/849INBxQnOGG1P0rixvafxsk8e+VRW5m 26c33Ga+4+7iV9W/jv5YKtWCnko8clHBSgbW7SD176eQ/sp9YwHVChFUX g==; IronPort-SDR: BWkcbR5AxwF2iycFyHmFaxZSAgxKJYRoqos5nrX6+PlLNcEqK23GWn9F/HlELF+p/99sLxqGaa PhQTBDI7ZfZzPNc2XT11jLYv3kYABhqFjyF40lgmIPztjPfpiRqVPY/uXiVOn+bNFsYd18MLlt MBBEMtVPPY/ozeOzhWlNrGwKd/HZyDHMPWo8FdfFwO4vXy0UPPXDR8fepz+2feov4APDTAO0gz YjbLVRqYuYaZWDlAhRCQDXAD0WaF+b8q74r7Xreji8VZ9d5RWGzN6dsc+8it7Wl7iUT3sJ/7ux Plc= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="75245170" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:07 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:07 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:06 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 6/8] drivers: most: fix typo in Kconfig Date: Thu, 14 May 2020 11:52:54 +0200 Message-ID: <1589449976-11378-7-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch corrects the typo in the Kconfig file where it says tranceiver instead of transceiver. Signed-off-by: Christian Gromm Reported-by: Randy Dunlap --- v2: drivers/most/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/most/Kconfig b/drivers/most/Kconfig index 8650683..42f042d 100644 --- a/drivers/most/Kconfig +++ b/drivers/most/Kconfig @@ -19,7 +19,7 @@ config MOST_USB tristate "USB" depends on USB && NET help - Say Y here if you want to connect via USB to network tranceiver. + Say Y here if you want to connect via USB to network transceiver. This device driver depends on the networking AIM. To compile this driver as a module, choose M here: the From patchwork Thu May 14 09:52:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548431 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B544C139A for ; Thu, 14 May 2020 09:53:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 964E5206DA for ; Thu, 14 May 2020 09:53:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="tNhpPvtB" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726135AbgENJxK (ORCPT ); Thu, 14 May 2020 05:53:10 -0400 Received: from esa6.microchip.iphmx.com ([216.71.154.253]:3795 "EHLO esa6.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726124AbgENJxJ (ORCPT ); Thu, 14 May 2020 05:53:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449989; x=1620985989; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=DEp+jW9wX2A5d1wOob0OjxiQCJhtD6AvZxH86gahl60=; b=tNhpPvtBhlqt7rDnDUukJXBIzRY6sKOqs8I0BPDSSNBMn6l04eq0QgCg Qy9+SICwSy06v+tRbkoMK/+EhfvFwU2TuTlfqmOCMBx5G+SbZXLwMtBcB tbwfpJRdtdzd/dSnMnhC+m8+oscb6pIrjcEqXco7KVSlUH9SoEeoIfAYe KWtUET1JuAqMIpwxomaqMKY6CPGPW7kM8HXuvJVSczzUGdgONwMxy8hvc Vu5Jt+lhz3txL/C7QyBDiOIh9cmynJ4ZUTJ5PSx0hMGZOP2LdwuBNFsIe wTHPLEiPhkOIGC2duBRHyg8JZsqlNxlwAJ/tAYWGRB1h24ZSDWvopK33b g==; IronPort-SDR: bQMgC3tNbmAzbe+mlt0DerGmX0Y9Gh+haZJkLcBrKMyuW5jdQYlDm9TvyfqYgXzci2VkGMzuQ7 MiCNJgr1YOT9FLKZEbqNxDfF8uM6kCyek2XoCYCmvpmt0crBAiEHwNxCEnjW//WApyUfnMvJvY 6lvsn3VbK8MkXB2ufA/BMCoQUzdA40eUoqGXIVd0Ic47x5w1TnzFzM1hpiuJcPz/qoobAivtLk nmvr9rcRzcFRWJibwqkU80xElW5okKYKugq3o7DXVaKXUG9lbGpKB4NIgzD6uZPQHVm832UYQo TKo= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="12346472" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa6.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:08 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:11 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:07 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 7/8] drivers: most: usb: use macro ATTRIBUTE_GROUPS Date: Thu, 14 May 2020 11:52:55 +0200 Message-ID: <1589449976-11378-8-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch makes use of the macro ATTRIBUTE_GROUPS to create the groups instead of defining them manually. Signed-off-by: Christian Gromm Reported-by: Greg Kroah-Hartman --- v2: drivers/most/most_usb.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/drivers/most/most_usb.c b/drivers/most/most_usb.c index 35620a1..dce64bb 100644 --- a/drivers/most/most_usb.c +++ b/drivers/most/most_usb.c @@ -999,14 +999,7 @@ static struct attribute *dci_attrs[] = { NULL, }; -static struct attribute_group dci_attr_group = { - .attrs = dci_attrs, -}; - -static const struct attribute_group *dci_attr_groups[] = { - &dci_attr_group, - NULL, -}; +ATTRIBUTE_GROUPS(dci); static void release_dci(struct device *dev) { @@ -1159,7 +1152,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id) mdev->dci->dev.init_name = "dci"; mdev->dci->dev.parent = get_device(mdev->iface.dev); - mdev->dci->dev.groups = dci_attr_groups; + mdev->dci->dev.groups = dci_groups; mdev->dci->dev.release = release_dci; if (device_register(&mdev->dci->dev)) { mutex_unlock(&mdev->io_mutex); From patchwork Thu May 14 09:52:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Gromm X-Patchwork-Id: 11548433 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4F7C81391 for ; Thu, 14 May 2020 09:53:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3482E20727 for ; Thu, 14 May 2020 09:53:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="O3aFuV41" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726124AbgENJxM (ORCPT ); Thu, 14 May 2020 05:53:12 -0400 Received: from esa2.microchip.iphmx.com ([68.232.149.84]:37259 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726119AbgENJxM (ORCPT ); Thu, 14 May 2020 05:53:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1589449990; x=1620985990; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=7sr8R+a8FhyrV5tLGE/O2dQuzK7UJ6QXJnSbaWaRDsg=; b=O3aFuV41qQWq61Eif5czvJET0kfe4dtu6x4Q6ycctCYXdbhvaZq4x+m2 W8IMQz3PAzEo0TBBtklstNIK2fGwk9aR9PchEZaQXqIZ2CTQfpm0CBaCZ +vFn8emNy7FNKTOjnG7MzZscNgefqaKBiiQDVEA525O7tGUffV2bjgCJL mXKxXMZiHLLph/bYHL8J21CWKFitPTSFE84L3JsidIGFA9L4EGof9+KgG +A7Zg/cGFYcMrauym3nvzU3L1Iqn2yRFJwnSzKSY3b6Bz0dsQXRhsQmk+ C8ctyD2/oS6QQ9B3wzBFbi8CfbNKiALb1EcLyH0oCKjE7BUP5Int6lCSn g==; IronPort-SDR: OXuutMCp8Emz1+Nws1o5GmhUbzS4NwyRH6BfmY7EhmSIyBtoyXnNYn9tnzYQKDtTacBOHtA8tr Smxjbo/uAzZtDZ29Pt9zUOiG+9OREJBvRa87z2/EEFnUaRs9831HE+DF0iBTZxWMPG23Z8vowO JzsiosqQJp65QJEHPpjdiP50cDDrK4i/ko5NTgCiUf01wAypWX0FwbPnrbpG6n1rU79PxVoy/5 10MpQvf0rSzDorUlCp3avM8k4Uf53JvV4VrhBN3NowSSYZE0elNrbelGJ7iEuTyCPskL9d575a OW0= X-IronPort-AV: E=Sophos;i="5.73,390,1583218800"; d="scan'208";a="75245175" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 14 May 2020 02:53:10 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Thu, 14 May 2020 02:53:09 -0700 Received: from localhost.localdomain (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.1713.5 via Frontend Transport; Thu, 14 May 2020 02:53:08 -0700 From: Christian Gromm To: CC: , , Christian Gromm Subject: [PATCH v2 8/8] Documentation: ABI: correct sysfs attribute description of MOST driver Date: Thu, 14 May 2020 11:52:56 +0200 Message-ID: <1589449976-11378-9-git-send-email-christian.gromm@microchip.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> References: <1589449976-11378-1-git-send-email-christian.gromm@microchip.com> MIME-Version: 1.0 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org This patch fixes the ABI description file sysfs-bus-most. Signed-off-by: Christian Gromm --- v2: Documentation/ABI/testing/sysfs-bus-most | 104 ++++++++++++++++--------------- 1 file changed, 53 insertions(+), 51 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-most b/Documentation/ABI/testing/sysfs-bus-most index 6b1d06e..ec0a603 100644 --- a/Documentation/ABI/testing/sysfs-bus-most +++ b/Documentation/ABI/testing/sysfs-bus-most @@ -1,14 +1,14 @@ -What: /sys/bus/most/devices/.../description +What: /sys/bus/most/devices//description Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Provides information about the interface type and the physical - location of the device. Hardware attached via USB, for instance, + Provides information about the physical location of the + device. Hardware attached via USB, for instance, might return <1-1.1:1.0> Users: -What: /sys/bus/most/devices/.../interface +What: /sys/bus/most/devices//interface Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm @@ -16,7 +16,7 @@ Description: Indicates the type of peripheral interface the device uses. Users: -What: /sys/bus/most/devices/.../dci +What: /sys/bus/most/devices//dci Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -26,7 +26,7 @@ Description: write the controller's DCI registers. Users: -What: /sys/bus/most/devices/.../dci/arb_address +What: /sys/bus/most/devices//dci/arb_address Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -35,7 +35,7 @@ Description: application wants to read from or write to. Users: -What: /sys/bus/most/devices/.../dci/arb_value +What: /sys/bus/most/devices//dci/arb_value Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -44,7 +44,7 @@ Description: is stored in arb_address. Users: -What: /sys/bus/most/devices/.../dci/mep_eui48_hi +What: /sys/bus/most/devices//dci/mep_eui48_hi Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -52,7 +52,7 @@ Description: This is used to check and configure the MAC address. Users: -What: /sys/bus/most/devices/.../dci/mep_eui48_lo +What: /sys/bus/most/devices//dci/mep_eui48_lo Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -60,7 +60,7 @@ Description: This is used to check and configure the MAC address. Users: -What: /sys/bus/most/devices/.../dci/mep_eui48_mi +What: /sys/bus/most/devices//dci/mep_eui48_mi Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -68,7 +68,7 @@ Description: This is used to check and configure the MAC address. Users: -What: /sys/bus/most/devices/.../dci/mep_filter +What: /sys/bus/most/devices//dci/mep_filter Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -76,7 +76,7 @@ Description: This is used to check and configure the MEP filter address. Users: -What: /sys/bus/most/devices/.../dci/mep_hash0 +What: /sys/bus/most/devices//dci/mep_hash0 Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -84,7 +84,7 @@ Description: This is used to check and configure the MEP hash table. Users: -What: /sys/bus/most/devices/.../dci/mep_hash1 +What: /sys/bus/most/devices//dci/mep_hash1 Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -92,7 +92,7 @@ Description: This is used to check and configure the MEP hash table. Users: -What: /sys/bus/most/devices/.../dci/mep_hash2 +What: /sys/bus/most/devices//dci/mep_hash2 Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -100,7 +100,7 @@ Description: This is used to check and configure the MEP hash table. Users: -What: /sys/bus/most/devices/.../dci/mep_hash3 +What: /sys/bus/most/devices//dci/mep_hash3 Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -108,7 +108,7 @@ Description: This is used to check and configure the MEP hash table. Users: -What: /sys/bus/most/devices/.../dci/ni_state +What: /sys/bus/most/devices//dci/ni_state Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -116,7 +116,7 @@ Description: Indicates the current network interface state. Users: -What: /sys/bus/most/devices/.../dci/node_address +What: /sys/bus/most/devices//dci/node_address Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -124,7 +124,7 @@ Description: Indicates the current node address. Users: -What: /sys/bus/most/devices/.../dci/node_position +What: /sys/bus/most/devices//dci/node_position Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -132,7 +132,7 @@ Description: Indicates the current node position. Users: -What: /sys/bus/most/devices/.../dci/packet_bandwidth +What: /sys/bus/most/devices//dci/packet_bandwidth Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -140,7 +140,7 @@ Description: Indicates the configured packet bandwidth. Users: -What: /sys/bus/most/devices/.../dci/sync_ep +What: /sys/bus/most/devices//dci/sync_ep Date: June 2016 KernelVersion: 4.15 Contact: Christian Gromm @@ -149,7 +149,7 @@ Description: endpoint. Users: -What: /sys/bus/most/devices/...// +What: /sys/bus/most/devices/// Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm @@ -160,91 +160,92 @@ Description: configure it. Users: -What: /sys/bus/most/devices/...//available_datatypes +What: /sys/bus/most/devices///available_datatypes Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates the data types the current channel can transport. + Indicates the data types the channel can transport. Users: -What: /sys/bus/most/devices/...//available_directions +What: /sys/bus/most/devices///available_directions Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates the directions the current channel is capable of. + Indicates the directions the channel is capable of. Users: -What: /sys/bus/most/devices/...//number_of_packet_buffers +What: /sys/bus/most/devices///number_of_packet_buffers Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates the number of packet buffers the current channel can + Indicates the number of packet buffers the channel can handle. Users: -What: /sys/bus/most/devices/...//number_of_stream_buffers +What: /sys/bus/most/devices///number_of_stream_buffers Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates the number of streaming buffers the current channel can + Indicates the number of streaming buffers the channel can handle. Users: -What: /sys/bus/most/devices/...//size_of_packet_buffer +What: /sys/bus/most/devices///size_of_packet_buffer Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates the size of a packet buffer the current channel can + Indicates the size of a packet buffer the channel can handle. Users: -What: /sys/bus/most/devices/...//size_of_stream_buffer +What: /sys/bus/most/devices///size_of_stream_buffer Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates the size of a streaming buffer the current channel can + Indicates the size of a streaming buffer the channel can handle. Users: -What: /sys/bus/most/devices/...//set_number_of_buffers +What: /sys/bus/most/devices///set_number_of_buffers Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - This is to configure the number of buffers of the current channel. + This is to read back the configured number of buffers of + the channel. Users: -What: /sys/bus/most/devices/...//set_buffer_size +What: /sys/bus/most/devices///set_buffer_size Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - This is to configure the size of a buffer of the current channel. + This is to read back the configured buffer size of the channel. Users: -What: /sys/bus/most/devices/...//set_direction +What: /sys/bus/most/devices///set_direction Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - This is to configure the direction of the current channel. + This is to read back the configured direction of the channel. The following strings will be accepted: - 'dir_tx', - 'dir_rx' + 'tx', + 'rx' Users: -What: /sys/bus/most/devices/...//set_datatype +What: /sys/bus/most/devices///set_datatype Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - This is to configure the data type of the current channel. + This is to read back the configured data type of the channel. The following strings will be accepted: 'control', 'async', @@ -252,30 +253,31 @@ Description: 'isoc_avp' Users: -What: /sys/bus/most/devices/...//set_subbuffer_size +What: /sys/bus/most/devices///set_subbuffer_size Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - This is to configure the subbuffer size of the current channel. + This is to read back the configured subbuffer size of + the channel. Users: -What: /sys/bus/most/devices/...//set_packets_per_xact +What: /sys/bus/most/devices///set_packets_per_xact Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - This is to configure the number of packets per transaction of - the current channel. This is only needed network interface - controller is attached via USB. + This is to read back the configured number of packets per + transaction of the channel. This is only applicable when + connected via USB. Users: -What: /sys/bus/most/devices/...//channel_starving +What: /sys/bus/most/devices///channel_starving Date: March 2017 KernelVersion: 4.15 Contact: Christian Gromm Description: - Indicates whether current channel ran out of buffers. + Indicates whether channel ran out of buffers. Users: What: /sys/bus/most/drivers/most_core/components