Home | History | Annotate | Download | only in sequences
      1 # Copyright (c) 2015 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 """
      6 MBIM Close Sequence
      7 
      8 Reference:
      9   [1] Universal Serial Bus Communication Class MBIM Compliance Testing: 20
     10       http://www.usb.org/developers/docs/devclass_docs/MBIM-Compliance-1.0.pdf
     11 
     12 """
     13 import common
     14 
     15 from autotest_lib.client.cros.cellular.mbim_compliance import mbim_channel
     16 from autotest_lib.client.cros.cellular.mbim_compliance import mbim_constants
     17 from autotest_lib.client.cros.cellular.mbim_compliance import mbim_errors
     18 from autotest_lib.client.cros.cellular.mbim_compliance \
     19         import mbim_message_request
     20 from autotest_lib.client.cros.cellular.mbim_compliance \
     21         import mbim_message_response
     22 from autotest_lib.client.cros.cellular.mbim_compliance.sequences \
     23         import sequence
     24 
     25 
     26 class MBIMCloseSequence(sequence.Sequence):
     27     """
     28     Implement the MBIM Close Sequence.
     29     In this sequence, a |MBIM_CLOSE_MSG| is sent to the modem in order to
     30     terminate the session between the host and the modem. The modem should send
     31     a |MBIM_CLOSE_DONE| as the response to |MBIM_CLOSE_MSG|.
     32     """
     33 
     34     def run_internal(self):
     35         """ Run the MBIM Close Sequence. """
     36         # Step 1
     37         # Send MBIM_CLOSE_MSG to the device.
     38         close_message = mbim_message_request.MBIMClose()
     39         device_context = self.device_context
     40         descriptor_cache = device_context.descriptor_cache
     41         packets = mbim_message_request.generate_request_packets(
     42                 close_message,
     43                 device_context.max_control_transfer_size)
     44         channel = mbim_channel.MBIMChannel(
     45                 device_context._device,
     46                 descriptor_cache.mbim_communication_interface.bInterfaceNumber,
     47                 descriptor_cache.interrupt_endpoint.bEndpointAddress,
     48                 device_context.max_control_transfer_size)
     49 
     50         # Step 2
     51         response_packets = channel.bidirectional_transaction(*packets)
     52         channel.close()
     53 
     54         response_message = mbim_message_response.parse_response_packets(
     55                 response_packets)
     56 
     57         # Step 3
     58         if response_message.transaction_id != close_message.transaction_id:
     59             mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
     60                                        'mbim1.0:9.4.2#1')
     61 
     62         if response_message.status_codes != mbim_constants.MBIM_STATUS_SUCCESS:
     63             mbim_errors.log_and_raise(mbim_errors.MBIMComplianceAssertionError,
     64                                       'mbim1.0:9.4.2#2')
     65 
     66         return close_message, response_message
     67