From: Johan Hovold Date: Fri, 27 May 2016 15:26:24 +0000 (+0200) Subject: greybus: interface: avoid I/O to bootrom during removal X-Git-Tag: v5.15~12752^2~378^2~21^2~327 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d9fa3494b78a4e7fe9d8243ddd5ec472668f8fdf;p=platform%2Fkernel%2Flinux-starfive.git greybus: interface: avoid I/O to bootrom during removal Add an interface quirk flag to suppress I/O during interface disable. This is needed to prevent I/O to the bootrom during controlled connection tear down (e.g. eject or driver unbind). This will be more obvious with the new connection tear-down procedure. Reviewed-by: Viresh Kumar Signed-off-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index 0f2b591..2cfb5a4 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -221,8 +221,8 @@ static int gb_interface_read_and_clear_init_status(struct gb_interface *intf) * Check if the interface is executing the quirky ES3 bootrom that, * for example, requires E2EFC, CSD and CSV to be disabled. */ - bootrom_quirks = GB_INTERFACE_QUIRK_NO_CPORT_FEATURES; - + bootrom_quirks = GB_INTERFACE_QUIRK_NO_CPORT_FEATURES | + GB_INTERFACE_QUIRK_FORCED_DISABLE; switch (init_status) { case GB_INIT_BOOTROM_UNIPRO_BOOT_STARTED: case GB_INIT_BOOTROM_FALLBACK_UNIPRO_BOOT_STARTED: @@ -674,6 +674,10 @@ void gb_interface_disable(struct gb_interface *intf) trace_gb_interface_disable(intf); + /* Set disconnected flag to avoid I/O during connection tear down. */ + if (intf->quirks & GB_INTERFACE_QUIRK_FORCED_DISABLE) + intf->disconnected = true; + list_for_each_entry_safe(bundle, next, &intf->bundles, links) gb_bundle_destroy(bundle); diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index 51772cc..e833f7d 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -13,6 +13,7 @@ #define GB_INTERFACE_QUIRK_NO_CPORT_FEATURES BIT(0) #define GB_INTERFACE_QUIRK_NO_INIT_STATUS BIT(1) #define GB_INTERFACE_QUIRK_NO_ARA_IDS BIT(2) +#define GB_INTERFACE_QUIRK_FORCED_DISABLE BIT(3) struct gb_interface { struct device dev;