mirror of
https://github.com/hathach/tinyusb.git
synced 2025-03-28 05:37:15 +00:00
change host driver open return type to bool
the descriptor len used by driver will be calculated by usbh
This commit is contained in:
parent
97703587d9
commit
22a5b1608c
@ -149,7 +149,7 @@ void cdch_init(void)
|
|||||||
tu_memclr(cdch_data, sizeof(cdch_data_t)*CFG_TUSB_HOST_DEVICE_MAX);
|
tu_memclr(cdch_data, sizeof(cdch_data_t)*CFG_TUSB_HOST_DEVICE_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
|
bool cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
|
||||||
{
|
{
|
||||||
(void) max_len;
|
(void) max_len;
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ uint16_t cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
// Protocol 0xFF can be RNDIS device for windows XP
|
// Protocol 0xFF can be RNDIS device for windows XP
|
||||||
TU_VERIFY( TUSB_CLASS_CDC == itf_desc->bInterfaceClass &&
|
TU_VERIFY( TUSB_CLASS_CDC == itf_desc->bInterfaceClass &&
|
||||||
CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL == itf_desc->bInterfaceSubClass &&
|
CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL == itf_desc->bInterfaceSubClass &&
|
||||||
0xFF != itf_desc->bInterfaceProtocol, 0);
|
0xFF != itf_desc->bInterfaceProtocol);
|
||||||
|
|
||||||
cdch_data_t * p_cdc = get_itf(dev_addr);
|
cdch_data_t * p_cdc = get_itf(dev_addr);
|
||||||
|
|
||||||
@ -186,7 +186,7 @@ uint16_t cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
// notification endpoint
|
// notification endpoint
|
||||||
tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc;
|
tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc;
|
||||||
|
|
||||||
TU_ASSERT( usbh_edpt_open(rhport, dev_addr, desc_ep), 0 );
|
TU_ASSERT( usbh_edpt_open(rhport, dev_addr, desc_ep) );
|
||||||
p_cdc->ep_notif = desc_ep->bEndpointAddress;
|
p_cdc->ep_notif = desc_ep->bEndpointAddress;
|
||||||
|
|
||||||
drv_len += tu_desc_len(p_desc);
|
drv_len += tu_desc_len(p_desc);
|
||||||
@ -205,9 +205,9 @@ uint16_t cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
for(uint32_t i=0; i<2; i++)
|
for(uint32_t i=0; i<2; i++)
|
||||||
{
|
{
|
||||||
tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;
|
tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;
|
||||||
TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_BULK == desc_ep->bmAttributes.xfer, 0);
|
TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_BULK == desc_ep->bmAttributes.xfer);
|
||||||
|
|
||||||
TU_ASSERT(usbh_edpt_open(rhport, dev_addr, desc_ep), 0);
|
TU_ASSERT(usbh_edpt_open(rhport, dev_addr, desc_ep));
|
||||||
|
|
||||||
if ( tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN )
|
if ( tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN )
|
||||||
{
|
{
|
||||||
@ -222,7 +222,7 @@ uint16_t cdch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return drv_len;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cdch_set_config(uint8_t dev_addr, uint8_t itf_num)
|
bool cdch_set_config(uint8_t dev_addr, uint8_t itf_num)
|
||||||
|
@ -121,11 +121,11 @@ void tuh_cdc_xfer_isr(uint8_t dev_addr, xfer_result_t event, cdc_pipeid_t pipe_i
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Internal Class Driver API
|
// Internal Class Driver API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
void cdch_init (void);
|
void cdch_init (void);
|
||||||
uint16_t cdch_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
|
bool cdch_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
|
||||||
bool cdch_set_config (uint8_t dev_addr, uint8_t itf_num);
|
bool cdch_set_config (uint8_t dev_addr, uint8_t itf_num);
|
||||||
bool cdch_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
bool cdch_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
||||||
void cdch_close (uint8_t dev_addr);
|
void cdch_close (uint8_t dev_addr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -249,19 +249,22 @@ static bool config_get_report_desc_complete (uint8_t dev_addr, tusb_control_requ
|
|||||||
|
|
||||||
static void config_driver_mount_complete(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len);
|
static void config_driver_mount_complete(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len);
|
||||||
|
|
||||||
uint16_t hidh_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
|
bool hidh_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
|
||||||
{
|
{
|
||||||
(void) max_len;
|
(void) max_len;
|
||||||
|
|
||||||
TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass, 0);
|
TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass);
|
||||||
|
|
||||||
|
// len = interface + hid + n*endpoints
|
||||||
|
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
|
||||||
|
TU_ASSERT(max_len >= drv_len);
|
||||||
|
|
||||||
uint16_t drv_len = sizeof(tusb_desc_interface_t);
|
|
||||||
uint8_t const *p_desc = (uint8_t const *) desc_itf;
|
uint8_t const *p_desc = (uint8_t const *) desc_itf;
|
||||||
|
|
||||||
//------------- HID descriptor -------------//
|
//------------- HID descriptor -------------//
|
||||||
p_desc = tu_desc_next(p_desc);
|
p_desc = tu_desc_next(p_desc);
|
||||||
tusb_hid_descriptor_hid_t const *desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc;
|
tusb_hid_descriptor_hid_t const *desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc;
|
||||||
TU_ASSERT(HID_DESC_TYPE_HID == desc_hid->bDescriptorType, 0);
|
TU_ASSERT(HID_DESC_TYPE_HID == desc_hid->bDescriptorType);
|
||||||
|
|
||||||
// not enough interface, try to increase CFG_TUH_HID
|
// not enough interface, try to increase CFG_TUH_HID
|
||||||
// TODO multiple devices
|
// TODO multiple devices
|
||||||
@ -269,13 +272,12 @@ uint16_t hidh_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
TU_ASSERT(hid_dev->inst_count < CFG_TUH_HID, 0);
|
TU_ASSERT(hid_dev->inst_count < CFG_TUH_HID, 0);
|
||||||
|
|
||||||
//------------- Endpoint Descriptor -------------//
|
//------------- Endpoint Descriptor -------------//
|
||||||
drv_len += tu_desc_len(p_desc);
|
|
||||||
p_desc = tu_desc_next(p_desc);
|
p_desc = tu_desc_next(p_desc);
|
||||||
tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc;
|
tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc;
|
||||||
TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType, 0);
|
TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType);
|
||||||
|
|
||||||
// TODO also open endpoint OUT
|
// TODO also open endpoint OUT
|
||||||
TU_ASSERT( usbh_edpt_open(rhport, dev_addr, desc_ep), 0 );
|
TU_ASSERT( usbh_edpt_open(rhport, dev_addr, desc_ep) );
|
||||||
|
|
||||||
hidh_interface_t* hid_itf = get_instance(dev_addr, hid_dev->inst_count);
|
hidh_interface_t* hid_itf = get_instance(dev_addr, hid_dev->inst_count);
|
||||||
hid_dev->inst_count++;
|
hid_dev->inst_count++;
|
||||||
@ -292,9 +294,7 @@ uint16_t hidh_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
hid_itf->protocol_mode = HID_PROTOCOL_BOOT;
|
hid_itf->protocol_mode = HID_PROTOCOL_BOOT;
|
||||||
if ( HID_SUBCLASS_BOOT == desc_itf->bInterfaceSubClass ) hid_itf->itf_protocol = desc_itf->bInterfaceProtocol;
|
if ( HID_SUBCLASS_BOOT == desc_itf->bInterfaceSubClass ) hid_itf->itf_protocol = desc_itf->bInterfaceProtocol;
|
||||||
|
|
||||||
drv_len += desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
|
return true;
|
||||||
|
|
||||||
return drv_len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hidh_set_config(uint8_t dev_addr, uint8_t itf_num)
|
bool hidh_set_config(uint8_t dev_addr, uint8_t itf_num)
|
||||||
|
@ -121,11 +121,11 @@ TU_ATTR_WEAK void tuh_hid_set_protocol_complete_cb(uint8_t dev_addr, uint8_t ins
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Internal Class Driver API
|
// Internal Class Driver API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
void hidh_init (void);
|
void hidh_init (void);
|
||||||
uint16_t hidh_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len);
|
bool hidh_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len);
|
||||||
bool hidh_set_config (uint8_t dev_addr, uint8_t itf_num);
|
bool hidh_set_config (uint8_t dev_addr, uint8_t itf_num);
|
||||||
bool hidh_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
|
bool hidh_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
|
||||||
void hidh_close (uint8_t dev_addr);
|
void hidh_close (uint8_t dev_addr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -360,22 +360,22 @@ static bool config_test_unit_ready_complete(uint8_t dev_addr, msc_cbw_t const* c
|
|||||||
static bool config_request_sense_complete(uint8_t dev_addr, msc_cbw_t const* cbw, msc_csw_t const* csw);
|
static bool config_request_sense_complete(uint8_t dev_addr, msc_cbw_t const* cbw, msc_csw_t const* csw);
|
||||||
static bool config_read_capacity_complete(uint8_t dev_addr, msc_cbw_t const* cbw, msc_csw_t const* csw);
|
static bool config_read_capacity_complete(uint8_t dev_addr, msc_cbw_t const* cbw, msc_csw_t const* csw);
|
||||||
|
|
||||||
uint16_t msch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
|
bool msch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
|
||||||
{
|
{
|
||||||
TU_VERIFY (MSC_SUBCLASS_SCSI == desc_itf->bInterfaceSubClass &&
|
TU_VERIFY (MSC_SUBCLASS_SCSI == desc_itf->bInterfaceSubClass &&
|
||||||
MSC_PROTOCOL_BOT == desc_itf->bInterfaceProtocol);
|
MSC_PROTOCOL_BOT == desc_itf->bInterfaceProtocol);
|
||||||
|
|
||||||
// msc driver length is fixed
|
// msc driver length is fixed
|
||||||
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
|
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
|
||||||
TU_ASSERT(drv_len <= max_len, 0);
|
TU_ASSERT(drv_len <= max_len);
|
||||||
|
|
||||||
msch_interface_t* p_msc = get_itf(dev_addr);
|
msch_interface_t* p_msc = get_itf(dev_addr);
|
||||||
tusb_desc_endpoint_t const * ep_desc = (tusb_desc_endpoint_t const *) tu_desc_next(desc_itf);
|
tusb_desc_endpoint_t const * ep_desc = (tusb_desc_endpoint_t const *) tu_desc_next(desc_itf);
|
||||||
|
|
||||||
for(uint32_t i=0; i<2; i++)
|
for(uint32_t i=0; i<2; i++)
|
||||||
{
|
{
|
||||||
TU_ASSERT(TUSB_DESC_ENDPOINT == ep_desc->bDescriptorType && TUSB_XFER_BULK == ep_desc->bmAttributes.xfer, 0);
|
TU_ASSERT(TUSB_DESC_ENDPOINT == ep_desc->bDescriptorType && TUSB_XFER_BULK == ep_desc->bmAttributes.xfer);
|
||||||
TU_ASSERT(usbh_edpt_open(rhport, dev_addr, ep_desc), 0);
|
TU_ASSERT(usbh_edpt_open(rhport, dev_addr, ep_desc));
|
||||||
|
|
||||||
if ( tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN )
|
if ( tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN )
|
||||||
{
|
{
|
||||||
@ -390,7 +390,7 @@ uint16_t msch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
|
|
||||||
p_msc->itf_num = desc_itf->bInterfaceNumber;
|
p_msc->itf_num = desc_itf->bInterfaceNumber;
|
||||||
|
|
||||||
return drv_len;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool msch_set_config(uint8_t dev_addr, uint8_t itf_num)
|
bool msch_set_config(uint8_t dev_addr, uint8_t itf_num)
|
||||||
|
@ -106,11 +106,11 @@ TU_ATTR_WEAK void tuh_msc_umount_cb(uint8_t dev_addr);
|
|||||||
// Internal Class Driver API
|
// Internal Class Driver API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
void msch_init (void);
|
void msch_init (void);
|
||||||
uint16_t msch_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len);
|
bool msch_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len);
|
||||||
bool msch_set_config (uint8_t dev_addr, uint8_t itf_num);
|
bool msch_set_config (uint8_t dev_addr, uint8_t itf_num);
|
||||||
bool msch_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
void msch_close (uint8_t dev_addr);
|
||||||
void msch_close (uint8_t dev_addr);
|
bool msch_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -147,16 +147,17 @@ void hub_init(void)
|
|||||||
tu_memclr(hub_data, CFG_TUSB_HOST_DEVICE_MAX*sizeof(hub_interface_t));
|
tu_memclr(hub_data, CFG_TUSB_HOST_DEVICE_MAX*sizeof(hub_interface_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t hub_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
|
bool hub_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
|
||||||
{
|
{
|
||||||
// hub driver does not support multiple TT yet
|
|
||||||
TU_VERIFY(TUSB_CLASS_HUB == itf_desc->bInterfaceClass &&
|
TU_VERIFY(TUSB_CLASS_HUB == itf_desc->bInterfaceClass &&
|
||||||
0 == itf_desc->bInterfaceSubClass &&
|
0 == itf_desc->bInterfaceSubClass);
|
||||||
1 <= itf_desc->bInterfaceProtocol, 0);
|
|
||||||
|
// hub driver does not support multiple TT yet
|
||||||
|
TU_VERIFY(itf_desc->bInterfaceProtocol <= 1);
|
||||||
|
|
||||||
// msc driver length is fixed
|
// msc driver length is fixed
|
||||||
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_desc_endpoint_t);
|
uint16_t const drv_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_desc_endpoint_t);
|
||||||
TU_ASSERT(drv_len <= max_len, 0);
|
TU_ASSERT(drv_len <= max_len);
|
||||||
|
|
||||||
//------------- Interrupt Status endpoint -------------//
|
//------------- Interrupt Status endpoint -------------//
|
||||||
tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);
|
tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);
|
||||||
@ -169,7 +170,7 @@ uint16_t hub_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const
|
|||||||
hub_data[dev_addr-1].itf_num = itf_desc->bInterfaceNumber;
|
hub_data[dev_addr-1].itf_num = itf_desc->bInterfaceNumber;
|
||||||
hub_data[dev_addr-1].ep_in = desc_ep->bEndpointAddress;
|
hub_data[dev_addr-1].ep_in = desc_ep->bEndpointAddress;
|
||||||
|
|
||||||
return drv_len;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hub_close(uint8_t dev_addr)
|
void hub_close(uint8_t dev_addr)
|
||||||
|
@ -181,11 +181,11 @@ bool hub_status_pipe_queue(uint8_t dev_addr);
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Internal Class Driver API
|
// Internal Class Driver API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
void hub_init (void);
|
void hub_init (void);
|
||||||
uint16_t hub_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
|
bool hub_open (uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
|
||||||
bool hub_set_config (uint8_t dev_addr, uint8_t itf_num);
|
bool hub_set_config (uint8_t dev_addr, uint8_t itf_num);
|
||||||
bool hub_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
bool hub_xfer_cb (uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);
|
||||||
void hub_close (uint8_t dev_addr);
|
void hub_close (uint8_t dev_addr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -43,11 +43,11 @@ typedef struct {
|
|||||||
char const* name;
|
char const* name;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void (* const init )(void);
|
void (* const init )(void);
|
||||||
uint16_t (* const open )(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
bool (* const open )(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
||||||
bool (* const set_config )(uint8_t dev_addr, uint8_t itf_num);
|
bool (* const set_config )(uint8_t dev_addr, uint8_t itf_num);
|
||||||
bool (* const xfer_cb )(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
|
bool (* const xfer_cb )(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);
|
||||||
void (* const close )(uint8_t dev_addr);
|
void (* const close )(uint8_t dev_addr);
|
||||||
} usbh_class_driver_t;
|
} usbh_class_driver_t;
|
||||||
|
|
||||||
// Call by class driver to tell USBH that it has complete the enumeration
|
// Call by class driver to tell USBH that it has complete the enumeration
|
||||||
|
Loading…
x
Reference in New Issue
Block a user