Re: [RFC PATCH] usb: gadget: mass_storage: Add GET_EVENT_STATUS_NOTIFICATION
Hi, Benjamin Herrenschmidt writes: > On Fri, 2018-07-27 at 09:53 +0300, Felipe Balbi wrote: >> Benjamin Herrenschmidt writes: >> >> > On Fri, 2018-07-27 at 08:38 +1000, Benjamin Herrenschmidt wrote: >> > > On Thu, 2018-07-26 at 14:01 +0300, Felipe Balbi wrote: >> > > > Hi, >> > > > >> > > > Benjamin Herrenschmidt writes: >> > > > > This is just RFC at this stage, I was getting annoyed at the >> > > > > once-per-seconddebug message about unsupported command when using >> > > > > f_mass_storage as a CDROM,so I quickly hacked that up. >> > > > > I'm not clearing the events per-se, I'm just sending events based on >> > > > > thestate of pending unit attentions, which seems to be enough to >> > > > > please Linuxon the other side, but definitely needs more testing or >> > > > > expert opinions. >> > > > > If I find some spare cycle in the next few weeks I might add a few >> > > > > moreof the basic MMC commands so we at least support everything >> > > > > Linux throwsat us for a normal read-only CDROM. >> > > > > Comments ? >> > > > > Not-Yet-Signed-off-by: Benjamin Herrenschmidt >> > > > > --- >> > > > > drivers/usb/gadget/function/f_mass_storage.c | 49 >> > > > > +++- 1 file changed, 48 insertions(+), 1 deletion(-) >> > > > > diff --git a/drivers/usb/gadget/function/f_mass_storage.c >> > > > > b/drivers/usb/gadget/function/f_mass_storage.cindex >> > > > > 7b13928077c9..d8c83359f470 100644--- >> > > > > a/drivers/usb/gadget/function/f_mass_storage.c+++ >> > > > > b/drivers/usb/gadget/function/f_mass_storage.c@@ -1390,6 +1390,42 @@ >> > > > > static int do_mode_select(struct fsg_common *common, struct >> > > > > fsg_buffhd *bh)return -EINVAL; } +static int >> > > > > do_get_event_status_notification(struct fsg_common *common,+ >> > > > > struct fsg_buffhd *bh)+{+ struct >> > > > > fsg_lun *curlun = common->curlun;+ u8 *buf = (u8 >> > > > > *) bh->buf;+ boolmedia_class;+ u8 event;+ >> > > > > int size;++ /* We only support media class */+ >> > > > > media_class = (common->cmnd[4] & 0x10) != 0;++ /* We just mirror >> > > > > the unit attentions */+ if (curlun->unit_attention_data == >> > > > > SS_NOT_READY_TO_READY_TRANSITION)+ event = 2; /* New media >> > > > > */+ else if (curlun->unit_attention_data == >> > > > > SS_MEDIUM_NOT_PRESENT)+ event = 3;+ else+ >> > > > > event = 0;++/* Fill common header */+ size = 4;+ >> > > > > buf[3] = 0x10; /* Support classes: media */+if (media_class) {+ >> > > > >buf[2] = 4; /* Return media event */+ if (event >> > > > > == 0)+buf[2] |= 0x80; /* No Event Available >> > > > > */+ size += 8;+ buf[4] = event;+ >> > > > > buf[5] = 1; /* Active */+ buf[6] = buf[7] = 0;+ >> > > > > } else {+ buf[2] = 0; /* None of the req. classes >> > > > > supported */+ }+ return size;+} >> > > > > /*-*/ >> > > > > @@ -1753,7 +1789,8 @@ static int check_command(struct fsg_common >> > > > > *common, int cmnd_size, */ if (curlun && >> > > > > curlun->unit_attention_data != SS_NO_SENSE && >> > > > > common->cmnd[0] != INQUIRY &&- common->cmnd[0] != >> > > > > REQUEST_SENSE) {+common->cmnd[0] != REQUEST_SENSE &&+ >> > > > > common->cmnd[0] != GET_EVENT_STATUS_NOTIFICATION) { >> > > > >curlun->sense_data = curlun->unit_attention_data; >> > > > > curlun->unit_attention_data = SS_NO_SENSE; return >> > > > > -EINVAL;@@ -2025,6 +2062,16 @@ static int do_scsi_command(struct >> > > > > fsg_common *common) reply = do_write(common); >> > > > >break; +case GET_EVENT_STATUS_NOTIFICATION:+ >> > > > > common->data_size_from_cmnd =+ >> > > > > get_unaligned_be16(&common->cmnd[7]);+ reply = >> > > > > check_command(common, 10, DATA_DIR_TO_HOST,+ >> > > > > (1 << 1) | (1 << 4) | (3 << 7) | (1 << 9),+ >> > > > > 0, "GET_EVENT_STATUS_NOTIFICATION");+ >> > > > > if (reply == 0)+reply = >> > > > > do_get_event_status_notification(common, bh);+ break;+ >> > > > >/* * Some mandatory commands that we recognize but don't >> > > > > implement.* They don't mean much in this setting. It's left >> > > > > as an exercise >> > > > >> > > > html + plain text? C'mon Ben :) >> > > >> > > No idea what happened ... ugh :-) >> > > >> > > I'll resend when I get a chance (travelling now). >> > >> > Odd, I re-checked my outbox and it was sent as a normal text-plain as >> > usual ... not su
Re: [RFC PATCH] usb: gadget: mass_storage: Add GET_EVENT_STATUS_NOTIFICATION
break;+ >> > > /* * Some mandatory commands that we recognize but don't >> > > implement.* They don't mean much in this setting. It's left as >> > > an exercise >> > >> > html + plain text? C'mon Ben :) >> >> No idea what happened ... ugh :-) >> >> I'll resend when I get a chance (travelling now). > > Odd, I re-checked my outbox and it was sent as a normal text-plain as > usual ... not sure what's up. I'll send again anyway. Headers may help, perhaps? Return-Path: X-Original-To: felipe.ba...@linux.intel.com Delivered-To: felipe.ba...@linux.intel.com Received: from linux.intel.com [10.54.29.200] by pipin with IMAP (fetchmail-6.3.26) for (single-drop); Wed, 11 Jul 2018 09:09:28 +0300 (EEST) Received: from orsmga002.jf.intel.com (orsmga002.jf.intel.com [10.7.209.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by linux.intel.com (Postfix) with ESMTPS id 26A575802A9 for ; Tue, 10 Jul 2018 23:12:09 -0700 (PDT) Received: from fmsmga105.fm.intel.com ([10.1.193.10]) by orsmga002-1.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2018 23:12:08 -0700 IronPort-PHdr: =?us-ascii?q?9a23=3A57oslh0Vfn658EVIsmDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?seIUL/ad9pjvdHbS+e9qxAeQG9mDtbQc06L/iOPJYSQ4+5GPsXQPItRndiQuro?= =?us-ascii?q?EopTEmG9OPEkbhLfTnPGQQFcVGU0J5rTngaRAGUMnxaEfPrXKs8DUcBgvwNRZv?= =?us-ascii?q?JuTyB4Xek9m72/q99pHPYghEniaxba9vJxiqsAvdsdUbj5F/Iagr0BvJpXVIe+?= =?us-ascii?q?VSxWx2IF+Yggjx6MSt8pN96ipco/0u+dJOXqX8ZKQ4UKdXDC86PGAv5c3krgfM?= =?us-ascii?q?QA2S7XYBSGoWkx5IAw/Y7BHmW5r6ryX3uvZh1CScIMb7Vq4/Vyi84Kh3SR/okC?= =?us-ascii?q?YHOCA/8GHLkcx7kaZXrAu8qxBj34LYZYeYP+d8cKzAZ9MXXWlPUNtRWSJfDI2z?= =?us-ascii?q?c4wBAOUaMOlCs4XwvUEDoAGiCQSuAu7k1z9GhmXx3a0/y+ksDB/J3AoiH90UtX?= =?us-ascii?q?TUrdP1P7oQX++r1qnI1yvMb/VN2Tjh6IjIdxEhruyQXbltdsfe0lcgFwXFjliL?= =?us-ascii?q?qozqISmV1uITvGif9eZvSfivhHQ8qwFxozivwMgshpPOhoIPxVDJ7CN0y5s2K9?= =?us-ascii?q?2gUEN2YNCpHIFOuy2ENIZ6WN4uT3totSs4zLANpIS1czIQyJs9wh7Sc/yHfJaM?= =?us-ascii?q?4hLkTOuRLi13hG57d76lmxmy61Kvyvb8Vsm11lZKoTBJkt7WtnACzxDT686HRe?= =?us-ascii?q?Vh/kq52DuC2Rrf5v9aLU03j6bXNoQtz74ym5YLtETMBC72mEH4jK+McUUk//Cl?= =?us-ascii?q?5P/5bbXgpp+RLIx0hR/kMqQohMO/Bf40PRQUX2eB4uS81Lzj/Uv2QLlQif02iK?= =?us-ascii?q?bZvIjAJcsHvq65HxNV0oE75haxETim1NUYnWEZI15fYx2IlYzpNErPIP3jCfe/?= =?us-ascii?q?glKskCpkxvzcP73hBInNIWbHkLv7Ybl97Etcm0IPyoVb5pRJGvQcO/jbRED8rp?= =?us-ascii?q?rbAwU/PgjyxPzoTJ1T24cfQW/HKKadOqKa5VGF4uM3Lq+GbYsfuR75Kv4497jv?= =?us-ascii?q?i2M0nRkWeqz/jrUNb3XtNPlgIUycYHykotobC2oMpQE+Se3mlBXWWzNVZ16xUr?= =?us-ascii?q?g66zV9A5ivFofCQI/rh6aOinToVqZKb3xLXwjfWUzjcJ+JDrJVMHqf?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DvAwB4n0VbfTkB5D9cHQEBBQELAYMbB?= =?us-ascii?q?IIMKIN6iGOLWpIvV4YxCxMYAYZvITcVAQIBAQEBAQECARMBARY6L4I1JAGDBgR?= =?us-ascii?q?ECWICXwESglVLgXMNBapkezMfhD2DdIE4iHyBVz+IZYM4glUCh2OKC4deCgmPJ?= =?us-ascii?q?oFDhA+CbIUiASuRZ4FXIYFTfQiDJIM2AQmNJS0wegEBii+CSAEB?= X-IPAS-Result: =?us-ascii?q?A0DvAwB4n0VbfTkB5D9cHQEBBQELAYMbBIIMKIN6iGOLWpI?= =?us-ascii?q?vV4YxCxMYAYZvITcVAQIBAQEBAQECARMBARY6L4I1JAGDBgRECWICXwESglVLg?= =?us-ascii?q?XMNBapkezMfhD2DdIE4iHyBVz+IZYM4glUCh2OKC4deCgmPJoFDhA+CbIUiASu?= =?us-ascii?q?RZ4FXIYFTfQiDJIM2AQmNJS0wegEBii+CSAEB?= X-IronPort-AV: E=Sophos;i="5.51,337,1526367600"; d="scan'208,217";a="121505201" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from gate.crashing.org ([63.228.1.57]) by mtab.intel.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 10 Jul 2018 23:11:55 -0700 Received: from localhost (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id w6B6Bhjr032022; Wed, 11 Jul 2018 01:11:45 -0500 Message-ID: <72657ec1625d63f32b44277fcc342d847955745f.ca...@kernel.crashing.org> Subject: [RFC PATCH] usb: gadget: mass_storage: Add GET_EVENT_STATUS_NOTIFICATION From: Benjamin Herrenschmidt To: linux-usb@vger.kernel.org, Felipe Balbi Date: Wed, 11 Jul 2018 16:11:43 +1000 Content-Type: multipart/alternative; boundary="=-dlrkufCl6ITIlrpPcVLl" X-Mailer: Evolution 3.28.3 (3.28.3-1.fc28) Mime-Version: 1.0 -- balbi signature.asc Description: PGP signature
[RFC PATCH] usb: gadget: mass_storage: Add GET_EVENT_STATUS_NOTIFICATION
This is just RFC at this stage, I was getting annoyed at the once-per-second debug message about unsupported command when using f_mass_storage as a CDROM, so I quickly hacked that up. I'm not clearing the events per-se, I'm just sending events based on the state of pending unit attentions, which seems to be enough to please Linux on the other side, but definitely needs more testing or expert opinions. If I find some spare cycle in the next few weeks I might add a few more of the basic MMC commands so we at least support everything Linux throws at us for a normal read-only CDROM. Comments ? Not-Yet-Signed-off-by: Benjamin Herrenschmidt --- drivers/usb/gadget/function/f_mass_storage.c | 49 +++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c index 7b13928077c9..d8c83359f470 100644 --- a/drivers/usb/gadget/function/f_mass_storage.c +++ b/drivers/usb/gadget/function/f_mass_storage.c @@ -1390,6 +1390,42 @@ static int do_mode_select(struct fsg_common *common, struct fsg_buffhd *bh) return -EINVAL; } +static int do_get_event_status_notification(struct fsg_common *common, + struct fsg_buffhd *bh) +{ + struct fsg_lun *curlun = common->curlun; + u8 *buf = (u8 *) bh->buf; + boolmedia_class; + u8 event; + int size; + + /* We only support media class */ + media_class = (common->cmnd[4] & 0x10) != 0; + + /* We just mirror the unit attentions */ + if (curlun->unit_attention_data == SS_NOT_READY_TO_READY_TRANSITION) + event = 2; /* New media */ + else if (curlun->unit_attention_data == SS_MEDIUM_NOT_PRESENT) + event = 3; + else + event = 0; + + /* Fill common header */ + size = 4; + buf[3] = 0x10; /* Support classes: media */ + if (media_class) { + buf[2] = 4; /* Return media event */ + if (event == 0) + buf[2] |= 0x80; /* No Event Available */ + size += 8; + buf[4] = event; + buf[5] = 1; /* Active */ + buf[6] = buf[7] = 0; + } else { + buf[2] = 0; /* None of the req. classes supported */ + } + return size; +} /*-*/ @@ -1753,7 +1789,8 @@ static int check_command(struct fsg_common *common, int cmnd_size, */ if (curlun && curlun->unit_attention_data != SS_NO_SENSE && common->cmnd[0] != INQUIRY && - common->cmnd[0] != REQUEST_SENSE) { + common->cmnd[0] != REQUEST_SENSE && + common->cmnd[0] != GET_EVENT_STATUS_NOTIFICATION) { curlun->sense_data = curlun->unit_attention_data; curlun->unit_attention_data = SS_NO_SENSE; return -EINVAL; @@ -2025,6 +2062,16 @@ static int do_scsi_command(struct fsg_common *common) reply = do_write(common); break; + case GET_EVENT_STATUS_NOTIFICATION: + common->data_size_from_cmnd = + get_unaligned_be16(&common->cmnd[7]); + reply = check_command(common, 10, DATA_DIR_TO_HOST, + (1 << 1) | (1 << 4) | (3 << 7) | (1 << 9), + 0, "GET_EVENT_STATUS_NOTIFICATION"); + if (reply == 0) + reply = do_get_event_status_notification(common, bh); + break; + /* * Some mandatory commands that we recognize but don't implement. * They don't mean much in this setting. It's left as an exercise -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [RFC PATCH] usb: gadget: mass_storage: Add GET_EVENT_STATUS_NOTIFICATION
Hi, Benjamin Herrenschmidt writes: > This is just RFC at this stage, I was getting annoyed at the > once-per-seconddebug message about unsupported command when using > f_mass_storage as a CDROM,so I quickly hacked that up. > I'm not clearing the events per-se, I'm just sending events based on thestate > of pending unit attentions, which seems to be enough to please Linuxon the > other side, but definitely needs more testing or expert opinions. > If I find some spare cycle in the next few weeks I might add a few moreof the > basic MMC commands so we at least support everything Linux throwsat us for a > normal read-only CDROM. > Comments ? > Not-Yet-Signed-off-by: Benjamin Herrenschmidt --- > drivers/usb/gadget/function/f_mass_storage.c | 49 +++- 1 file > changed, 48 insertions(+), 1 deletion(-) > diff --git a/drivers/usb/gadget/function/f_mass_storage.c > b/drivers/usb/gadget/function/f_mass_storage.cindex > 7b13928077c9..d8c83359f470 100644--- > a/drivers/usb/gadget/function/f_mass_storage.c+++ > b/drivers/usb/gadget/function/f_mass_storage.c@@ -1390,6 +1390,42 @@ static > int do_mode_select(struct fsg_common *common, struct fsg_buffhd *bh) > return -EINVAL; } +static int do_get_event_status_notification(struct > fsg_common *common,+ struct > fsg_buffhd *bh)+{+ struct fsg_lun *curlun = common->curlun;+ u8 >*buf = (u8 *) bh->buf;+ boolmedia_class;+ u8 > event;+ int size;++ /* We only support media class */+ > media_class = (common->cmnd[4] & 0x10) != 0;++ /* We just mirror the unit > attentions */+ if (curlun->unit_attention_data == > SS_NOT_READY_TO_READY_TRANSITION)+ event = 2; /* New media */+ > else if (curlun->unit_attention_data == SS_MEDIUM_NOT_PRESENT)+ event > = 3;+ else+ event = 0;++/* Fill common header */+ > size = 4;+ buf[3] = 0x10; /* Support classes: media */+if > (media_class) {+ buf[2] = 4; /* Return media event */+ > if (event == 0)+buf[2] |= 0x80; /* No Event Available > */+ size += 8;+ buf[4] = event;+ > buf[5] = 1; /* Active */+ buf[6] = buf[7] = 0;+ } else {+ > buf[2] = 0; /* None of the req. classes supported */+ }+ > return size;+} > /*-*/ > @@ -1753,7 +1789,8 @@ static int check_command(struct fsg_common *common, int > cmnd_size, */ if (curlun && curlun->unit_attention_data != SS_NO_SENSE > && common->cmnd[0] != INQUIRY &&- common->cmnd[0] != > REQUEST_SENSE) {+common->cmnd[0] != REQUEST_SENSE &&+ > common->cmnd[0] != GET_EVENT_STATUS_NOTIFICATION) { > curlun->sense_data = curlun->unit_attention_data; > curlun->unit_attention_data = SS_NO_SENSE; return -EINVAL;@@ > -2025,6 +2062,16 @@ static int do_scsi_command(struct fsg_common *common) > reply = do_write(common); break; +case > GET_EVENT_STATUS_NOTIFICATION:+common->data_size_from_cmnd =+ > get_unaligned_be16(&common->cmnd[7]);+ reply = > check_command(common, 10, DATA_DIR_TO_HOST,+ > (1 << 1) | (1 << 4) | (3 << 7) | (1 << 9),+ > 0, "GET_EVENT_STATUS_NOTIFICATION");+ if (reply == 0)+ > reply = do_get_event_status_notification(common, bh);+ > break;+ /* * Some mandatory commands that we recognize but > don't implement.* They don't mean much in this setting. It's left as > an exercise html + plain text? C'mon Ben :) -- balbi signature.asc Description: PGP signature